web-dev-qa-db-ja.com

OPTIONS 405(メソッドは許可されていません)サーバーがAccess-Control-Allow-Methods:OPTIONS、GET、HEAD、POST

クロスドメインリクエストを作成しようとしていますが、サーバーは次のヘッダーを送信するように構成されています。

_Access-Control-Allow-Credentials:true
Access-Control-Allow-Headers:x-requested-with, Authorization
Access-Control-Allow-Methods:OPTIONS, GET, HEAD, POST
Access-Control-Allow-Origin:*
_

しかし、OPTIONリクエストが行われると、OPTIONS 405 (Method Not Allowed)エラーが発生します。

問題は何ですか、それを修正する方法はありますか?

9
Spadar Shut

私は2つの解決策を提案します:

1)WebAPIを使用している場合は、必要オプションメソッドを実装します。これは、慣例により次のようになります。

_public class XXXController : ApiController
{
    // OPTION http-verb handler
    public string OptionsXXX()
    {
        return null; // HTTP 200 response with empty body
    }

    ...
}
_

2)WebAPIを使用している場合はnotコードのどの部分が、OPTION呼び出しのOPTIONS 405 (Method Not Allowed)エラーをトリガーするかを理解してください。その場合、_Web.config_ファイルにこれらの_<customHeaders/>_が機能するかどうかを確認します。

_<configuration>
  <system.webServer>
    <httpProtocol>
      <customHeaders>
        <!-- CORS temporary solution -->
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Headers" value="Content-Type, Authorization, Accept, X-Requested-With" />
        <add name="Access-Control-Allow-Methods" value="OPTIONS, TRACE, GET, HEAD, POST, PUT" />
      </customHeaders>
    </httpProtocol>
  </system.webServer>
</configuration>
_
8
Filippo Vitale

Webサーバー/アプリケーションは、HTTPGET動詞およびPOST動詞要求ごとに上記の応答ヘッダーを送信するように構成されている可能性があります。しかし、WebサーバーはHTTP OPTIONS動詞を処理するように構成されていますか?

詳細が必要な場合は、使用しているWebサーバーとアプリケーションプログラミングテクノロジーを提供してください。

少し背景がありますが、カスタムリクエストヘッダーを含むクロスドメインリクエストがある場合、ブラウザはOPTIONSリクエストを送信します。このリクエストは、実際のリクエストの前に行われます。ブラウザは、このリクエストがあなたが言及したレスポンスヘッダーとともに戻ってきた場合にのみ、実際のリクエストを行います。

//これらのOPTIONSリクエストはプリフライトリクエストと呼ばれます-通常、ブラウザの開発ツールはネットワークタブでそれらを追跡しません。f

6
humblelistener

デフォルトのOPTIONSVerbHandlerを変更する必要があります。 asp classicを使用している場合は、Web.configファイルに次の行を追加することを意味します。

    <handlers>
        <remove name="OPTIONSVerbHandler" />
        <add name="OPTIONSVerbHandler" path="*" verb="OPTIONS" modules="IsapiModule" scriptProcessor="C:\Windows\System32\inetsrv\asp.dll" resourceType="Unspecified" requireAccess="None" />
    </handlers>
2