3

特定のドメインに対してクロスドメインAJAXリクエストを有効にするために、global.asax.csに次のコードがあります。

    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        string whiteList =
            System.Configuration.ConfigurationManager.AppSettings["AjaxCrossDomainWhitelist"];

        if (!string.IsNullOrWhiteSpace(whiteList))
        {

            string[] whiteListDomains = whiteList.Split(';');

            string origin = Request.Headers["origin"];

            if (!string.IsNullOrEmpty(origin))
            {
                origin = origin.ToLower();

                foreach (string domain in whiteListDomains)
                {
                    if (domain.ToLower() == origin)
                    {
                        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", domain);
                        break;
                    }
                }
            }



            if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
            {

                //These headers are handling the "pre-flight" OPTIONS call sent by the browser
                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept");
                //Access Control policy has a lifetime of one hour
                HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "3600");
                HttpContext.Current.Response.End();
            }
        }

    }

Webサイトで呼び出されたWebサービスの1つが正常に戻ると、「Access-Control-Allow-Origin」ヘッダーが正常に送信され、すべてが正常に機能します。ただし、サービス呼び出しによって例外が発生した場合。「Access-Control-Allow-Origin」ヘッダーは引き続きHttpContext.Responseに追加されます。Application_EndRequestをトラップし、Response.Headersコレクションをチェックすることで同じことを確認しました。ただし、Firebug、Chrome Dev Tools、またはCharlesで送信された応答を確認すると、「Access-Control-Allow-Origin」ヘッダーが送信されなかったため、理由がわかりません。

ポインタはありますか?

4

1 に答える 1