2017-04-17 23 views
2

GETリクエストではメソッドが許可されていないという(OPTIONS)という非常に一般的な問題があります。私はAPI呼び出しを行うたびに次のエラーが発生します。私はweb.configでこの設定を持っている:405メソッドのオプションはasp.net web apiコントローラで許可されていませんか?

<system.webServer> 
    <modules> 
    <remove name="WebDAVModule"/> 
    </modules> 
    <httpProtocol> 
    <customHeaders> 
     <add name="Access-Control-Allow-Origin" value="*"/> 
     <add name="Access-Control-Allow-Headers" value="Origin, Authorization, X-Requested-With, Content-Type, Accept"/> 
     <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS"/> 
    </customHeaders> 
    </httpProtocol> 
    <handlers> 
    <remove name="WebDAV"/> 
    <remove name="ExtensionlessUrlHandler-Integrated-4.0"/> 
    <remove name="OPTIONSVerbHandler"/> 
    <remove name="TRACEVerbHandler"/> 
    <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0"/> 
    </handlers> 
</system.webServer> 

私はAsp.Net.WebApi.Corsを使用して、すべての起源ヘッダおよび方法EnableCors()を使用してグローバルCORSを施行しようと、それはどちらか動作しませんでした。

+0

あなたがしているIISのバージョンは何を使用して? – mason

+0

@mason:iis 10.0 express – user1505521

答えて

4

あなたhandlers<remove name="OPTIONSVerbHandler"/>後には、これを追加します。

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

IIS hijacks CORS Preflight OPTIONS requestで答えを参照してください。

それともだけでもこの:

<add name="OPTIONSVerbHandler" path="*" verb="OPTIONS" 
    modules="ProtocolSupportModule" requireAccess="None" /> 

問題が解決しない場合は、お使いのglobal.asaxまたは他のコードに次のように追加されます何か:

protected void Application_BeginRequest(object sender,EventArgs e) 
{ 
    HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*"); 
    if(HttpContext.Current.Request.HttpMethod == "OPTIONS") 
    { 
     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(); 
    } 
} 
+0

試した1番目と2番目がうまくいきませんでした.. 3番目の方法はうまくいきましたが、起動時にAPI設定をパイプライン処理するためにGlobal.asaxを使用していないため、私は、プリフライト要求を非同期的に取得するたびに応答を送信するカスタムMesageハンドラを定義することによって、同じアプローチの解決策を見つけました。 アイデアは同じなので、私は答えを与えます。 – user1505521

関連する問題