9

我正在尝试在我的 .Net Web API 应用程序中为某些域启用 CORS,并且能够通过此代码在 Application Start 上执行此操作..

public static void Register(HttpConfiguration config)
{
    //below comma separated string is built from database
    var domains = "http://www.myfirstdomain.com,http://www.myseconddomain.co.uk .... about 130 domains more..";
    config.EnableCors(new EnableCorsAttribute(domains, "*", "*"));

但是,如果在应用程序运行时添加了新域,则在应用程序池被回收并再次建立此列表之前,这些将不允许跨域发布。

有什么方法可以在我的应用程序生命周期内更新此列表?我知道我可以定期回收应用程序池,但这会导致一些我理想情况下可以不做的请求延迟。

我知道我可以在控制器方法上启用它,即..

[EnableCors("http://domain1.com,http://domain2.com", "*", "*")]
public HttpResponseMessage PostAsync([FromBody] MyRequest myRequest)
{

然而,逗号分隔的参数必须声明为常量,因此不能是动态的。

我是否遗漏了一些明显的东西,或者任何人都可以想到一种体面的方式来做到这一点?

编辑

这是我编写自己的自定义 EnableCors 属性的尝试。

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = false)]
public class EnableCorsByDomainAttribute : Attribute, ICorsPolicyProvider
{
    private readonly CorsPolicy _policy;

    public EnableCorsByDomainAttribute()
    {
        _policy = new CorsPolicy
        {
            AllowAnyMethod = true,
            AllowAnyHeader = true
        };

        var originsString = "http://www.test1.com,http://www.test2.com";
        if (!String.IsNullOrEmpty(originsString))
        {
            foreach (var origin in originsString.Split(','))
            {
                _policy.Origins.Add(origin);
            }
        }
    }

    public Task<CorsPolicy> GetCorsPolicyAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        return Task.FromResult(_policy);
    }
}

然后我用

[EnableCorsByDomain]
4

1 回答 1

7

是的,Web API CORS 为这种场景提供了一个扩展点。您可以查看以下 Web API 功能规范文档中名为“实现自定义 ICorsPolicyProvider ”的部分以获取更多详细信息。

http://aspnetwebstack.codeplex.com/wikipage?title=CORS%20support%20for%20ASP.NET%20Web%20API&referringTitle=Specs

于 2013-11-13T16:32:51.907 回答