97

最近、Javascript リクエストを別のドメインに投稿することに遭遇しました。デフォルトでは、他のドメインへの XHR 投稿は許可されていません。

http://enable-cors.org/の指示に従って、他のドメインでこれを有効にしました。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
 <system.webServer>
  <httpProtocol>
    <customHeaders>
      <add name="Access-Control-Allow-Origin" value="*" />
      <add name="Access-Control-Allow-Methods" value="GET,PUT,POST,DELETE,OPTIONS" />
      <add name="Access-Control-Allow-Headers" value="Content-Type" />
    </customHeaders>
  </httpProtocol>
 </system.webServer>
</configuration>

ここに画像の説明を入力

現在はすべて正常に動作していますが、動作中の 200 応答を返す前に 405 応答が返されます。

Request URL:http://testapi.nottherealsite.com/api/Reporting/RunReport
Request Method:OPTIONS
Status Code:405 Method Not Allowed
Request Headersview source
Accept:*/*
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-GB,en-US;q=0.8,en;q=0.6
Access-Control-Request-Headers:origin, content-type, accept
Access-Control-Request-Method:POST
Connection:keep-alive
Host:testapi.nottherealsite.com
Origin:http://test.nottherealsite.com
Referer:http://test.nottherealsite.com/Reporting
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1
Response Headersview source
Access-Control-Allow-Headers:Content-Type
Access-Control-Allow-Methods:GET,PUT,POST,DELETE,OPTIONS
Access-Control-Allow-Origin:*
Allow:POST
Cache-Control:private
Content-Length:1565
Content-Type:text/html; charset=utf-8
Date:Tue, 18 Sep 2012 14:26:06 GMT
Server:Microsoft-IIS/7.5
X-AspNet-Version:4.0.30319
X-Powered-By:ASP.NET

更新: 2014 年 3 月 2 日

MSDN マガジンに最近更新された記事があります。ASP.NET Web API 2 での CORS サポートの詳細。

http://msdn.microsoft.com/en-us/magazine/dn532203.aspx

4

10 に答える 10

80

アプリケーションで指定するのではなく、IIS 7 が HTTP OPTIONS 応答を「処理」している可能性があります。これを判断するには、IIS7 で、

  1. サイトのハンドラー マッピングに移動します。

  2. 「OPTIONSVerbHandler」までスクロールします。

  3. 「ProtocolSupportModule」を「IsapiHandler」に変更します

  4. 実行可能ファイルを設定します: %windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll

これで、HTTP OPTIONS 動詞が送信されたときに、上記の構成エントリが開始されるはずです。

または、BeginRequest メソッドで HTTP OPTIONS 動詞に応答することもできます。

    protected void Application_BeginRequest(object sender,EventArgs e)
    {
        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");

        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, PUT, DELETE");
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept");
            HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000" );
            HttpContext.Current.Response.End();
        }

    }
于 2013-01-31T16:55:50.763 に答える
10

基本的なソリューションに必要なものに本当に近いDavidGの回答から詳しく説明します。

  • 最初に、OPTIONSVerbHandler を .Net ハンドラーの前に実行するように構成します。

    1. IIS コンソールで、[ハンドラー マッピング] を選択します (サーバー レベルまたはサイト レベルのいずれかです。サイト レベルでは、サイトのすべてのハンドラーが再定義され、その後サーバー レベルで行われた変更が無視されることに注意してください。もちろんサーバー レベルでは、オプション動詞を独自に処理する必要がある場合、他のサイトが壊れる可能性があります)。
    2. アクション ペインで、[順序付けされたリストを表示...] を選択します。

    また、web.config ですべてのハンドラーを再定義することでこれを行うこともできます<system.webServer><handlers>(<clear>その後、<add ...>それらを元に戻します。これが IIS コンソールの役割です) (ちなみに、このハンドラーで "読み取り" パーミッションを要求する必要はありません)。

  • 次に、次のように、cors のニーズに合わせてカスタム http ヘッダーを構成します。

    <system.webServer>
      <httpProtocol>
        <customHeaders>
          <add name="Access-Control-Allow-Origin" value="*"/>
          <add name="Access-Control-Allow-Headers" value="Content-Type"/>
          <add name="Access-Control-Allow-Methods" value="POST,GET,OPTIONS"/>
        </customHeaders>
      </httpProtocol>
    </system.webServer>
    

    これは、IIS コンソールでも実行できます。

これは、cors ヘッダーを必要としないリクエストでも送信するため、基本的なソリューションです。しかし、WCF を使用すると、最も単純なように見えます。

MVC または webapi を使用すると、代わりに OPTIONS 動詞と cors ヘッダーをコードで (「手動で」、または webapi の最新バージョンで利用可能な組み込みサポートを使用して) 処理できます。

于 2013-11-21T14:01:42.507 に答える
9

405 応答は、「メソッドは許可されていません」という応答です。サーバーが CORS プリフライト リクエストを処理するように適切に構成されていないようです。次の 2 つのことを行う必要があります。

1) IIS7 が HTTP OPTIONS 要求に応答できるようにします。IIS7 が OPTIONS 要求を拒否しているため、405 を取得しています。私は IIS7 に慣れていないので、これを行う方法はわかりませんが、スタック オーバーフローにはおそらくそうしている他の人がいます。

2) CORS プリフライト リクエストに応答するようにアプリケーションを構成します。Access-Control-Allow-Originこれを行うには、<customHeaders>セクションの行の下に次の 2 行を追加します。

<add name="Access-Control-Allow-Methods" value="GET,PUT,POST,DELETE" />
<add name="Access-Control-Allow-Headers" value="Content-Type" />

Access-Control-Allow-Headersリクエストが要求しているヘッダーに基づいて、セクションに他の値を追加する必要がある場合があります。リクエストを行うためのサンプルコードはありますか?

CORS と CORS プリフライトの詳細については、http ://www.html5rocks.com/en/tutorials/cors/ をご覧ください。

于 2012-09-17T13:10:08.740 に答える
9

Microsoft がこの問題を解決するためにギャップを特定し、帯域外 CORS モジュールを出荷するのに何年もかかりました。

  1. Microsoftからモジュールをインストールする
  2. スニペットで構成する

以下のように

<configuration>
    <system.webServer>
        <cors enabled="true" failUnlistedOrigins="true">            
            <add origin="http://*" allowed="true" />
        </cors>
    </system.webServer>
</configuration>

一般に、カスタム ヘッダーよりもはるかに簡単で、プリフライト リクエストの処理も優れています。

IIS Express で同じことが必要な場合は、私が書いたいくつかの PowerShell スクリプトを使用してください。

于 2020-03-24T01:57:27.233 に答える
3

ASP.net Web API 2 では、nuget を介して Microsoft ASP.NET Cross Origin サポートをインストールします。

http://enable-cors.org/server_aspnet.html

public static void Register(HttpConfiguration config)
{
 var enableCorsAttribute = new EnableCorsAttribute("http://mydomain.com",
                                                   "Origin, Content-Type, Accept",
                                                   "GET, PUT, POST, DELETE, OPTIONS");
        config.EnableCors(enableCorsAttribute);
}
于 2014-02-03T22:15:14.107 に答える
3

私にとっての解決策は、追加することでした:

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
      <remove name="WebDAVModule"/>
    </modules>
</system.webServer>

私のweb.configに

于 2016-04-05T20:55:58.673 に答える