başlığını eklemiyor here numaralı açıklandığı gibi DynamicPolicyProviderFactory
kullanıyorum.CORS etkin Web API'sı
<MyApp.Properties.Settings>
<setting name="AllowedDomains" serializeAs="Xml">
<value>
<ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<string>http://localhost</string>
<string>http*://*.domain1.com</string>
<string>http*://*.domain2.com</string>
</ArrayOfString>
</value>
</setting>
</MyApp.Properties.Settings>
: cors geçirilen WebApiConfig.cs
config.EnableCors();
config.SetCorsPolicyProviderFactory(new DynamicPolicyProviderFactory(Settings.Default.AllowedDomains));
Ve uygulama ayarlarını kazanmak kayıt
public class DynamicPolicyProviderFactory : ICorsPolicyProviderFactory
{
private readonly HashSet<Regex> _allowed;
public DynamicPolicyProviderFactory(IEnumerable allowedOrigins)
{
_allowed = new HashSet<Regex>();
foreach (string pattern in allowedOrigins.Cast<string>()
.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<CorsPolicy> GetCorsPolicyAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
return Task.FromResult(this._policy);
}
}
Benim çağrı: Aşağıda DynamicPolicyProviderFactory benim sürümüdür
Bu ayarlara rağmen, Access-Control-Allow-Origin
başlığım r'de yok http://mg.domain1.com
'dan http://localhost
'a bir istekte bulunursam esponses. Web Api 2.2 ve Microsoft.AspNet.Cors 5.2.2 kullanıyorum.
düzenleme: buldum ben denetleyicisinde EnableCors
özelliğini kullanın veya benim dinamik fabrika şey olmalı bu yüzden, çalışır küresel (config.EnableCors(new EnableCorsAttribute("*", "*", "*"));
) etkinlestirdiginizde. Sinir bozucu olan, DynamicPolicyProvider'ın iyi çalıştığım başka bir projeden kopyalanması/yapıştırılmasıdır.
düzenlemek 2:! Başarı ... Ben tracing etkin ve hatayı Yani sadece bunlara izin verecek şekilde GetPolicyForControllerAndOrigin
yöntemi düzenlenmiş
The collection of headers 'accept,content-type' is not allowed
bulundu. Şimdi her şey çalışıyor, çünkü kafamın dışında başka bir projede (DynamicPolicyProviderFactory'den kopyaladığım) bu kasnaktan atlamak zorunda kalmadım.
CORS kurulumunu, her birinin "neredeyse işe yaradığı" ve belgelerin korkunç olduğunu, her yere yerleştirilebilmesinin nasıl yapılabileceğine dair birçok farklı yolla yaptıklarını ve yarısını ikiye katlamadıklarını görmek inanılmaz. çalışmasını sağlamak için uygulanması gerekiyordu. – pootzko
@pootzko Kesinlikle katılıyorum! Ayrıca Mike_G, DynamicPolicyProviderFactory.cs dosyasını kök klasörüne koyabilir miyim yoksa belirli bir klasöre mi gitmeliyim? Bu nedir: ', Web.config dosyasında hiçbir yerde bulamıyorum. Bu "AppSettings" mi? – Si8
@ Si8 'DynamicPolicyProviderFactory', diğer sınıflar gibidir ve herhangi bir kod klasöründe düzenlenebilir. 'MyApp.Poperties.Settings' için web.config dosyasındadır, ancak bu belirli bir bölümü düzenlemek için bir kullanıcı arayüzü istiyorsanız, projenizde VS> Özellikler> Ayarlar –