origin net mvc enable control asp allow asp.net-web-api cors

asp.net web api - net - WebApi DelegatingHandler no solicitó solicitudes CORS de verificación previa



enable cors web config (1)

Estoy tratando de implementar el soporte CORS para mis controladores WebApi, y estoy siguiendo el ejemplo aquí .

Mi controlador se ve así:

/// <summary> /// Taken from http://blogs.msdn.com/b/carlosfigueira/archive/2012/02/20/implementing-cors-support-in-asp-net-web-apis.aspx /// </summary> public class CorsHandler : DelegatingHandler { private const string Origin = "Origin"; private const string AccessControlRequestMethod = "Access-Control-Request-Method"; private const string AccessControlRequestHeaders = "Access-Control-Request-Headers"; private const string AccessControlAllowOrigin = "Access-Control-Allow-Origin"; private const string AccessControlAllowMethods = "Access-Control-Allow-Methods"; private const string AccessControlAllowHeaders = "Access-Control-Allow-Headers"; private const string AccessControlAllowCredentials = "Access-Control-Allow-Credentials"; protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { var isCorsRequest = request.Headers.Contains(Origin); var isPreflightRequest = request.Method == HttpMethod.Options; if (isCorsRequest) { if (isPreflightRequest) { var response = new HttpResponseMessage(HttpStatusCode.OK); response.Headers.Add(AccessControlAllowOrigin, request.Headers.GetValues(Origin).First()); var accessControlRequestMethod = request.Headers.GetValues(AccessControlRequestMethod).FirstOrDefault(); if (accessControlRequestMethod != null) { response.Headers.Add(AccessControlAllowMethods, accessControlRequestMethod); } var requestedHeaders = string.Join(", ", request.Headers.GetValues(AccessControlRequestHeaders)); if (!string.IsNullOrEmpty(requestedHeaders)) { response.Headers.Add(AccessControlAllowHeaders, requestedHeaders); } response.Headers.Add(AccessControlAllowCredentials, "true"); var tcs = new TaskCompletionSource<HttpResponseMessage>(); tcs.SetResult(response); return response; } var resp = await base.SendAsync(request, cancellationToken); resp.Headers.Add(AccessControlAllowOrigin, request.Headers.GetValues(Origin).First()); resp.Headers.Add(AccessControlAllowHeaders, "*"); resp.Headers.Add(AccessControlAllowCredentials, "true"); return resp; } return await base.SendAsync(request, cancellationToken); } }

En mi clase WebApiConfig, estoy registrando ese controlador de esta manera:

config.MessageHandlers.Add(new CorsHandler());

Y se llama para solicitudes de "GET". Pero no se le llama para ninguna solicitud que requiera aprobación previa. La solicitud se ve así:

Request OPTIONS /api/campaigns/1002/customerusers/1008 HTTP/1.1 Accept */* Origin http://app.dev.alanta.com Access-Control-Request-Method DELETE Access-Control-Request-Headers accept Accept-Encoding gzip, deflate User-Agent Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0) Host dev.payboard.com Content-Length 0 DNT 1 Connection Keep-Alive Cache-Control no-cache

Pero como dije, nunca se llama al manejador para el verbo OPTIONS.

Pensé que podría haber algún otro controlador que interfiera con esto en alguna parte, pero eliminé a todos los posibles candidatos, y hasta ahora no tuve suerte.

Mi otra teoría es que no está reconociendo esa ruta particular para el verbo OPTIONS, por lo que nunca está entregando la solicitud al subsistema WebApi, y está siendo manejado en otro lado. Pero no estoy del todo claro cómo solucionar eso.

Sugerencias?


Agregue a web.config lo siguiente:

<handlers> <remove name="OPTIONSVerbHandler" /> </handlers>