2017-08-10 21 views
4

Asp.net Web APIの特定のアクションでCORSを有効にしたいとします。ここで私はそれをやろうとしている方法は次のとおりです。"EnableCorsを使用している場合、要求されたリソースはhttpメソッド 'OPTIONS'をサポートしていません

[Route("api/mycontroller/myaction")] 
[HttpPost] 
[EnableCors("https://example.com", "*", "post")] 
public async Task<IHttpActionResult> MyAction() 
{ 
    ... 
} 

しかし、私はルートにOPTIONSリクエストを送信するとき、私は戻ってエラーが出ます:「要求されたリソースは、HTTPメソッド 『OPTIONS』をサポートしていません。」また、[HttpPost]アノテーションを無駄に削除しようとしました。 私は何が欠けていますか?

+0

hmmm、あなたはPOSTだけで、OPTIONSではなくリクエストを送信しようとしましたか?私はあなたがCORS要求をするとき、ブラウザはあなたのためのOPTIONSのものをバックグラウンドで実行すると思う(私は間違っているかもしれない)。 – victor

+0

POST要求自体は機能しますが、ブラウザはOPTIONS要求を最初に送信し、それは失敗し、POSTを送信することはありません。 – SZH

+0

[EnableCors( "https://example.com"、 "*"、 "post、options")]? アクションには、POST – victor

答えて

3

HttpConfiguration.EnableCorsへのより高いレベルのコールがここに記載されています。https://enable-cors.org/server_aspnet.html

Add this code to your configuration:

public static void Register(HttpConfiguration config) 
{ 
    // New code 
    config.EnableCors(); 
} 
+0

WebApiConfig.csで 'config.EnableCors()'を呼び出すと、API全体でCORSが有効になると思っていました。私はそれが注釈を使うための前提条件であることを知らなかった。私もOWIN CORSをインストールしました。https://stackoverflow.com/a/29452419/560722 – SZH

3

あなたはそれがあなたのアプリケーションのコードに到達する前にOPTIONS要求は、アプリケーション・コードではなく、システムの他の部分で扱われます確認してください、あなたはあなたのweb.configに以下を追加してみてください可能性があります

<system.webServer> 
    <handlers> 
    <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> 

また含める必要があります:

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

は、Aをご覧ください。 nswerはIIS hijacks CORS Preflight OPTIONS requestです。

それともだけでもこの:

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

、自身の作品にそのどれもが、その後、あなたのglobal.asaxまたは他のコードでは、あなたがしようとしていない可能性がある場合:

if (filterContext.HttpContext.Request.HttpMethod == "OPTIONS") 
{ 
    filterContext.HttpContext.Response.Flush(); 
} 

...または上の他のいくつかのバリエーションをたとえば、次のようになります。

if (Request.Headers.AllKeys.Contains("Origin", StringComparer.OridinalIgnoreCase) 
    && Request.HttpMethod == "OPTIONS") { 
    Response.Flush(); 
} 

どのような特定のコードを使用していても、ある:

  • は確かOPTIONS要求は、実際にアプリケーションによって処理/捕まるさせるコード-ないキャッチ/史上
  • 作るアプリのコードに到達する前に、システムの他の部分で扱う明示的な取り扱いを持っていることを確認アプリケーションコード
  • OPTIONS要求のために、アプリケーション・コードの取り扱いOPTIONSがちょうどResponse.Flush()

または私はに関連しているかわからない、別のアプローチを行う作りますあなたの状況は、コード化されたとしてではなく、私は念のために言及します:私にとって

public HttpResponseMessage Options() 
{ 
    var response = new HttpResponseMessage 
    { 
     StatusCode = HttpStatusCode.OK 
    }; 
    return response; 
} 
+0

非常に包括的な答えをありがとう、私は古いサイトを維持する必要があります。 ' 'は動作します。 –

+0

乾杯 - うれしかった – sideshowbarker

1

、私はGlobal.asax.csのApplication_BeginRequest関数に次のコードを追加することで、要求に以下のヘッダを追加しましたファイル:

protected void Application_BeginRequest() 
{ 
    if (Request.Headers.AllKeys.Contains("Origin", StringComparer.CurrentCultureIgnoreCase) 
     && Request.HttpMethod == "OPTIONS") 
    { 
     Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept, Pragma, Cache-Control, Authorization "); 
     Response.End(); 
    } 
} 

私はこれがなぜ機能するのかほとんど考えていません。 アスタリスクを使用してすべてのヘッダーを追加しようとしましたが、Web APIがAuthorizationヘッダーが欠落していると不平を言っていました。

関連する問題