【发布时间】:2017-02-22 23:58:21
【问题描述】:
我一直在尝试为我的 API 启用多个来源的 CORS,但没有成功。
这是我所做的。
创建了 CORS 策略
[AttributeUsage(AttributeTargets.All, AllowMultiple =false, Inherited =true)]
public class TCCorsPolicyProvider : Attribute, ICorsPolicyProvider
{
private CorsPolicy _policy;
public TCCorsPolicyProvider()
{
_policy = new CorsPolicy
{
SupportsCredentials = true
};
string[] allowedOrigins = "john.doe,ava.wise".Split(',');
string[] allowedMethods = "GET,POST,PUT,OPTIONS".Split(',');
string[] allowedHeaders = "Content-Type,Origin,Authorization,Accept".Split(',');
// Add allowed origins.
foreach (string origin in allowedOrigins)
_policy.Origins.Add(origin);
foreach (string method in allowedMethods)
_policy.Methods.Add(method);
foreach (string header in allowedHeaders)
_policy.Headers.Add(header);
}
public Task<CorsPolicy> GetCorsPolicyAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
return Task.FromResult(_policy);
}
}
创建工厂
public class TCCorsPolicyProviderFactory : ICorsPolicyProviderFactory
{
ICorsPolicyProvider _provider;
public TCCorsPolicyProviderFactory()
{
_provider = new TCCorsPolicyProvider();
}
public ICorsPolicyProvider GetCorsPolicyProvider(HttpRequestMessage request)
{
return _provider;
}
}
在 WebApiConfig.cs 类中启用 Cors
config.SetCorsPolicyProviderFactory(new TCCorsPolicyProviderFactory());
config.EnableCors();
确保在 Global.asax Application_Start 中进行了适当的注册
GlobalConfiguration.Configure(WebApiConfig.Register);
当上述方法不起作用时,我什至手动将策略属性应用于所有其他控制器继承的基本控制器
[TCCorsPolicyProvider]
public class BaseApiController : ApiController
{
public string IpAddress
{
get { return ContextHelper.GetIpAddress(); }
}
private bool _disposed;
protected virtual void Dispose(bool disposing, Action disposeAction)
{
if (!_disposed)
{
if (disposing)
{
disposeAction();
}
}
_disposed = true;
}
}
但我收到以下错误(Invoking Api from Angular)
XMLHttpRequest 无法加载 hqidwtcdwa01/api/localizations/reloadCache。 请求中不存在“Access-Control-Allow-Origin”标头 资源。因此,Origin 'ava.wise' 不允许访问。这 响应的 HTTP 状态代码为 401。
hqidwtcdwa01 是目的地,ava.wise 是起点。
到目前为止,我发现 xmlhttp 响应中的 http 响应标头不包含 Access-Control-Allow-Origin。但是,当我使用 HttpCient 时,我可以看到标题。
【问题讨论】:
标签: .net angularjs asp.net-web-api cors