2

Thinktecture.IdentityModel nuget パッケージを使用して、MVC Web アプリケーションで WebAPI コントローラーの CORS を有効にしています。現時点では、POST についてのみ心配していますが、他の動詞で問題が発生した場合はお知らせください。これは、IIS Express サーバーを介して実行している場合に機能します。

AppHarbor の展開を扱う場合、機能しません。nginx は私のコードへの OPTIONS リクエストを通過していないようです。AppHarbor で実行するには他に何が必要ですか?

リクエスト

OPTIONS $path HTTP/1.1
Host: $servername Connection: keep-alive
Access-Control-Request-Method: POST
Origin: http://www.local
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.17 (KHTML、Gecko など) Chrome/24.0.1312.56 Safari/537.17
Access-Control-Request-Headers: accept, origin, content-type
Accept: /
Referer: http://www.local/wordpress/2013/01/request- url-test/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-GB,en;q=0.8,en-US;q=0.6
Accept-Charset: ISO-8859-1,utf-8;q= 0.7,*;q=0.3

応答

HTTP/1.1 200 OK
サーバー: nginx
日付: 2013 年 1 月 30 日水曜日 02:34:14 GMT
コンテンツの長さ: 0
接続: キープアライブ
許可: OPTIONS、TRACE、GET、HEAD、POST
パブリック: OPTIONS、TRACE、GET、ヘッド、ポスト

私の web.config は、次の既定のハンドラーで設定されています。

<handlers>
  <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
  <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
  <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
  <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
  <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
  <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>

WebDAV のせいですか?

Jeffery To の提案の後、次の手順に従ってWebDAV を無効にしました。WebDAV が AH にインストールされていることさえ知りませんでしたが、これを行うと結果が変わりました。

関連する Web.config セクション

<handlers>
  <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
  <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
  <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
  <remove name="WebDAV" />
  <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
  <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
  <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
<modules runAllManagedModulesForAllRequests="true">
  <remove name="WebDAVModule"/>
  <remove name="AspNetAppHarborIntegration" />
  <add name="AspNetAppHarborIntegration" type="Premotion.AspNet.AppHarbor.Integration.AppHarborModule, Premotion.AspNet.AppHarbor.Integration" />
</modules>

リクエスト

OPTIONS $path HTTP/1.1
Host: $servername
Connection: keep-alive
Access-Control-Request-Method: POST
Origin: http://www.local
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.17 (KHTML、Gecko など) Chrome/24.0.1312.57 Safari/537.17
Access-Control-Request-Headers: accept, origin, content-type
Accept: /
Referer: http://www.local/wordpress/2013/01/request- url-test/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-GB,en;q=0.8,en-US;q=0.6
Accept-Charset: ISO-8859-1,utf-8;q= 0.7,*;q=0.3

応答

HTTP/1.1 405 Method Not Allowed
サーバー: nginx
日付: 2013 年 2 月 4 日月曜日 17:09:19 GMT
コンテンツ タイプ: アプリケーション/json。charset=utf-8
Content-Length: 76
Connection: keep-alive
Cache-Control: no-cache
プラグマ: no-cache
Expires: -1

4

2 に答える 2

2

応答で完全な CORS ヘッダーを取得できないという最初の問題は、WebDAV のせいでした。405 エラーは、アプリの構成のどこかに問題がありました。

内部を掘り下げると、WebAPI (Thinktecture が提供) で使用する CORSMessageHandler がプリフライト要求を正しく識別せず、それらの要求が WebAPI オブジェクト自体にルーティングされたようです。

WebAPIモジュールではなくIISモジュールに移動することで、この問題を回避しました。これにより、将来の生活がより困難になる可能性がありますが、少なくとも機能します。

于 2013-02-04T23:50:52.577 に答える
0

ここに何か不足している可能性がありますが、あなたが含めた応答の例に基づいて、OPTIONSメソッドが実際にアプリケーションに送信されているようです -AllowおよびPublicヘッダーが応答に含まれています。

于 2013-01-31T05:12:07.727 に答える