Estoy trabajando en la creación de un nuevo conjunto de servicios en ASP.MVC MVC 4 utilizando la API web. Hasta ahora, es genial. Creé el servicio y lo puse a trabajar, y ahora estoy tratando de consumirlo usando JQuery. Puedo recuperar la cadena JSON usando Fiddler, y parece estar bien, pero debido a que el servicio existe en un sitio separado, intento llamarlo con errores de JQuery con "No permitido". Entonces, este es claramente un caso en el que necesito usar JSONP.
Sé que la API web es nueva, pero espero que alguien pueda ayudarme.
¿Cómo hago una llamada a un método de API web usando JSONP?
jquery
jsonp
asp.net-mvc-4
asp.net-web-api
Brian McCord
fuente
fuente
Respuestas:
Después de hacer esta pregunta, finalmente encontré lo que necesitaba, así que estoy respondiendo.
Me encontré con este JsonpMediaTypeFormatter . Agregarlo a la
Application_Start
de su global.asax al hacer esto:y es bueno ir con una llamada JQuery AJAX que se ve así:
Parece funcionar muy bien.
fuente
GlobalConfiguration.Configuration.AddJsonpFormatter(config.Formatters.JsonFormatter, "callback");
Aquí hay una versión actualizada de JsonpMediaTypeFormatter para usar con WebAPI RC:
fuente
Puedes usar un ActionFilterAttribute como este:
Luego ponlo en tu acción:
fuente
Ciertamente, la respuesta de Brian es la correcta, sin embargo, si ya está utilizando el formateador Json.Net, que le da fechas json bonitas y una serialización más rápida, entonces no puede simplemente agregar un segundo formateador para jsonp, debe combinar los dos. Es una buena idea usarlo de todos modos, ya que Scott Hanselman ha dicho que el lanzamiento de la API web ASP.NET va a usar el serializador Json.Net de forma predeterminada.
fuente
La implementación de Rick Strahl funcionó mejor para mí con RC.
fuente
JSONP solo funciona con la solicitud Http GET. Hay un soporte CORS en asp.net web api que funciona bien con todos los verbos http.
Este artículo puede ser útil para usted.
fuente
Actualizado
fuente
Aquí hay una versión actualizada con varias mejoras, que funciona con la versión RTM de las API web.
Accept-Encoding
encabezados de la solicitud . Ennew StreamWriter()
los ejemplos anteriores simplemente usaría UTF-8. La llamada abase.WriteToStreamAsync
puede usar una codificación diferente, lo que da como resultado una salida corrupta.application/javascript
Content-Type
encabezado; el ejemplo anterior generaría JSONP, pero con elapplication/json
encabezado. Este trabajo se realiza en laMapping
clase anidada (cf. ¿El mejor tipo de contenido para servir JSONP? )StreamWriter
obtiene directamente los bytes y los escribe en la secuencia de salida.ContinueWith
mecanismo de la Biblioteca Paralela de Tareas para encadenar varias tareas.Código:
Soy consciente de la "piratería" del
Func<string>
parámetro en el constructor de la clase interna, pero fue la forma más rápida de solucionar el problema que resuelve, ya que C # solo tiene clases internas estáticas, no puede ver laCallbackQueryParameter
propiedad. Al pasarFunc
in, se vincula la propiedad en lambda, porMapping
lo que podrá acceder a ella más adelanteTryMatchMediaType
. Si tienes una forma más elegante, ¡por favor comenta!fuente
Desafortunadamente, no tengo suficiente reputación para comentar, así que publicaré una respuesta. @Justin planteó el problema de ejecutar el formateador WebApiContrib.Formatting.Jsonp junto con el JsonFormatter estándar. Ese problema se resuelve en la última versión (que se lanzó hace algún tiempo). Además, debería funcionar con la última versión de API web.
fuente
johperl, Thomas. La respuesta dada por Peter Moberg arriba debe ser correcta para la versión RC ya que JsonMediaTypeFormatter que hereda usa el serializador NewtonSoft Json, y lo que tiene debería funcionar sin ningún cambio.
Sin embargo, ¿por qué demonios la gente todavía usa parámetros? ¿Cuándo podría hacer lo siguiente?
fuente
En lugar de alojar su propia versión de formateador JSONP, puede instalar el paquete WebApiContrib.Formatting.Jsonp NuGet con uno ya implementado (elija la versión que funcione para su .NET Framework).
Agregue este formateador en
Application_Start
:fuente
Para aquellos de ustedes que están utilizando el HttpSelfHostServer, esta sección del código fallará en HttpContext.Current, ya que no existe en el servidor de host.
Sin embargo, puede interceptar el "contexto" del propio host a través de esta anulación.
El método request.Metho le dará "GET", "POST", etc. y el GetQueryNameValuePairs puede recuperar el parámetro? Callback. Por lo tanto, mi código revisado se ve así:
Espero que esto ayude a alguno de ustedes. De esta manera, no necesariamente necesita una cuña HttpContext.
C.
fuente
Mira esto. A ver si ayuda.
JSONP con API web
fuente
Si el contexto es
Web Api
, agradeciendo y refiriéndose a010227leo
la respuesta, debe considerar elWebContext.Current
valor que va a sernull
.Así que actualicé su código a esto:
fuente
Podemos resolver el problema de CORS (intercambio de recursos de origen cruzado) de dos maneras,
1) Usando Jsonp 2) Habilitando los Cors
1) Usando Jsonp- para usar Jsonp, necesitamos instalar el paquete Nuget WebApiContrib.Formatting.Jsonp y necesitamos agregar JsonpFormmater en WebApiConfig.cs referir capturas de pantalla,
Código jquery
2) Habilitar los Cors -
para habilitar los cors necesitamos agregar el paquete nuget Microsoft.AspNet.WebApi.Cors y necesitamos habilitar los cors en WebApiConfig.cs consulte la captura de pantalla
Para obtener más referencia, puede consultar mi repositorio de muestra en GitHub usando el siguiente enlace. https://github.com/mahesh353/Ninject.WebAPi/tree/develop
fuente