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=仕様

于 2013-11-13T16:32:51.907 に答える