with type the responded resource not method failed error allowed jquery web-services rest post wcf-rest

type - jQuery.ajax() La solicitud POST arroja 405(método no permitido) en RESTful WCF



jquery ajax post (3)

Estoy enviando una solicitud posterior a una aplicación de servicio RESTFUL WCF. Puedo enviar con éxito una solicitud POST través de Fiddler.

Sin embargo, cuando hago esto a través del método jQuery Ajax, la función devuelve lo siguiente a Chrome Developer Console:

OPTIONS http://www.example.com/testservice/service1.svc/GetData 405 (Method Not Allowed) jquery.min.js:6

Pero luego un segundo después de los registros:

Object {d: "You entered 10"} testpost.html:16

Lo que esto me dice es que jQuery envía una solicitud OPTIONS , que falla, y luego envía una solicitud POST que devuelve los datos esperados.

Mi código jQuery:

$.ajax() { type: "POST", //GET or POST or PUT or DELETE verb url: "http://www.example.com/testservice/service1.svc/GetData", // Location of the service data: ''{"value":"10"}'', //Data sent to server contentType:"application/json", dataType: "json", //Expected data format from server processdata: false, success: function (msg) {//On Successfull service call console.log(msg); }, error: function (xhr) { console.log(xhr.responseText); } // When Service call fails });

Estoy usando jQuery versión 2.0.2.

Cualquier ayuda sobre por qué ocurre este error sería de gran ayuda.


Debe agregar este código en global.aspx :

protected void Application_BeginRequest(object sender, EventArgs e) { HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*"); if (HttpContext.Current.Request.HttpMethod == "OPTIONS") { HttpContext.Current.Response.AddHeader("Cache-Control", "no-cache"); HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST"); HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept"); HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000"); HttpContext.Current.Response.End(); } }


También puede crear los encabezados necesarios en un filtro.

@WebFilter(urlPatterns="/rest/*") public class AllowAccessFilter implements Filter { @Override public void doFilter(ServletRequest sRequest, ServletResponse sResponse, FilterChain chain) throws IOException, ServletException { System.out.println("in AllowAccessFilter.doFilter"); HttpServletRequest request = (HttpServletRequest)sRequest; HttpServletResponse response = (HttpServletResponse)sResponse; response.setHeader("Access-Control-Allow-Origin", "*"); response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT"); response.setHeader("Access-Control-Allow-Headers", "Content-Type"); chain.doFilter(request, response); } ... }


Su código en realidad está intentando realizar una solicitud de dominio cruzado (CORS) , no un POST ordinario.

Es decir: los navegadores modernos solo permitirán llamadas Ajax a servicios en el mismo dominio que la página HTML.

Ejemplo: una página en http://www.example.com/myPage.html solo puede solicitar servicios directamente en http://www.example.com , como http://www.example.com/testservice/etc . Si el servicio está en otro dominio, el navegador no realizará la llamada directa (como era de esperar). En cambio, intentará hacer una solicitud CORS.

Para decirlo brevemente, para realizar una solicitud CORS, su navegador:

  • Primero enviaremos una solicitud de OPTION a la URL objetivo
  • Y solo si la respuesta del servidor a esa OPTION contiene los encabezados adecuados ( Access-Control-Allow-Origin es uno de ellos) para permitir la solicitud CORS, el navegador realizará la llamada (casi exactamente como lo haría si la página HTML estaba en el mismo dominio).
    • Si los encabezados esperados no aparecen, el navegador simplemente se da por vencido (como lo hizo con usted).

¿Cómo resolverlo? La forma más sencilla es habilitar CORS (habilitar los encabezados necesarios) en el servidor.

Si no tiene acceso al servidor, puede duplicar el servicio web desde otro lugar y luego habilitar CORS allí.