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í.