API Web abilitata per CORS non riesce ad aggiungere intestazione

Sto usando DynamicPolicyProviderFactory come descritto qui . Di seguito è la mia versione di DynamicPolicyProviderFactory:

 public class DynamicPolicyProviderFactory : ICorsPolicyProviderFactory { private readonly HashSet _allowed; public DynamicPolicyProviderFactory(IEnumerable allowedOrigins) { _allowed = new HashSet(); foreach (string pattern in allowedOrigins.Cast() .Select(Regex.Escape) .Select(pattern => pattern.Replace("*", "w*"))) { _allowed.Add(new Regex(pattern, RegexOptions.IgnoreCase)); } if (_allowed.Count >= 1) return; //if nothing is specified, we assume everything is. _allowed.Add(new Regex(@"https://\w*", RegexOptions.IgnoreCase)); _allowed.Add(new Regex(@"http://\w*", RegexOptions.IgnoreCase)); } public ICorsPolicyProvider GetCorsPolicyProvider(HttpRequestMessage request) { var route = request.GetRouteData(); var controller = (string)route.Values["controller"]; var corsRequestContext = request.GetCorsRequestContext(); var originRequested = corsRequestContext.Origin; var policy = GetPolicyForControllerAndOrigin(controller, originRequested); return new CustomPolicyProvider(policy); } private CorsPolicy GetPolicyForControllerAndOrigin(string controller, string originRequested) { // Do lookup to determine if the controller is allowed for // the origin and create CorsPolicy if it is (otherwise return null) if (_allowed.All(a => !a.Match(originRequested).Success)) return null; var policy = new CorsPolicy(); policy.Origins.Add(originRequested); policy.Methods.Add("GET"); policy.Methods.Add("POST"); policy.Methods.Add("PUT"); policy.Methods.Add("DELETE"); return policy; } } public class CustomPolicyProvider : ICorsPolicyProvider { private readonly CorsPolicy _policy; public CustomPolicyProvider(CorsPolicy policy) { this._policy = policy; } public Task GetCorsPolicyAsync(HttpRequestMessage request, CancellationToken cancellationToken) { return Task.FromResult(this._policy); } } 

La mia chiamata per registrare il cors vince il WebApiConfig.cs

  config.EnableCors(); config.SetCorsPolicyProviderFactory(new DynamicPolicyProviderFactory(Settings.Default.AllowedDomains)); 

E le mie impostazioni dell’applicazione vengono passate:

     http://localhost http*://*.domain1.com http*://*.domain2.com     

Nonostante queste impostazioni, l’intestazione Access-Control-Allow-Origin non è presente nelle mie risposte se faccio una richiesta da http://mg.domain1.com a http://localhost . Sto usando Web Api 2.2 e Microsoft.AspNet.Cors 5.2.2.

modifica: ho scoperto che se utilizzo l’attributo EnableCors sul controller o lo config.EnableCors(new EnableCorsAttribute("*", "*", "*")); globalmente ( config.EnableCors(new EnableCorsAttribute("*", "*", "*")); ) funziona, quindi deve essere qualcosa con la mia fabbrica dynamic. La cosa frustrante è che DynamicPolicyProvider è copia / incollato da un altro progetto che sto usando che funziona bene.

edit 2: Success! … Ho abilitato la traccia e ho trovato l’errore

  The collection of headers 'accept,content-type' is not allowed 

Quindi ho appena modificato il metodo GetPolicyForControllerAndOrigin per consentirglielo. Ora tutto funziona, eccetto che sono confuso perché non ho dovuto saltare attraverso questo canvasio nel mio altro progetto (quello da cui ho copiato DynamicPolicyProviderFactory).

Abilita la traccia nell’app. Dovresti vedere un errore

 The collection of headers 'accept,content-type' is not allowed 

Basta aggiungere questi alle intestazioni consentite per la politica e tutto dovrebbe funzionare.