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>