StackOverflowで似たような問題を数多く読んだことがありますが、解決策はありません。
WCF RESTサービス:
[<OperationContract>]
[<WebInvoke(UriTemplate = "PostItem",
RequestFormat= WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json, Method = "POST")>]
Postman(Chrome拡張)を使用して使用できます。 「urlencoded」ではなく「raw」としてデータを渡します。そして、200の戻りコードを受け取ります。
Angularjsを使用してこのメソッドを呼び出す必要があります:
$http.post('http://192.168.1.65/Service1.svc/restapi/PostItem',
{
"Address": "г. Москва, ул. Соколово-Мещерская, д.25",
...
"User": ""
})
PostmanからURLとJSONをコピーしました。しかし、私はエラーを受け取ります:
angular.js:10722 OPTIONS http://192.168.1.65/Service1.svc/restapi/PostItemhttp://192.168.1.65/Service1.svc/restapi/PostItem 。プリフライトの応答に無効なHTTPステータスコード405が含まれています
同様の問題を検索し、2つの解決策を見つけました。
Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
を設定しますが、WCFサービスでは機能しませんWeb.Configでカスタムヘッダーを設定します。
<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="GET, POST, PUT, DELETE, OPTIONS" />
</customHeaders>
</httpProtocol>
それは私を助けません。そして、サーバー側のエラーの理由がわからない。 Postman拡張機能は、このメソッドを正常に呼び出すことができます。
同じPOST AngularJSを使用して呼び出しますか?
更新:
OPTIONSリクエストは次のとおりです。
[レビュー]タブと[応答]タブは空です
更新2:
IEではすべて正常に動作しますが、Chromeでは動作しません。
私は解決策を見つけたようです。 2番目のメソッドを追加しました。
[<OperationContract>]
[<WebInvoke(UriTemplate = "PostTest",
RequestFormat= WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json, Method = "POST")>]
abstract PostTest: obj: Test -> unit
[<OperationContract>]
[<WebInvoke(UriTemplate = "PostTest",
RequestFormat= WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json, Method = "OPTIONS")>]
abstract PostTestOptions: unit -> unit
何もしないのは単なる空のメソッドです。理由はわかりませんが、すべて機能しています。
閉ざされた質問でさえ、私は自分にとって何が効果的かを示したい。
まず、web.configでCORSを有効にする必要があります(Mihai sadなど):
<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="GET, POST, PUT, DELETE, OPTIONS" />
</customHeaders>
</httpProtocol>
追加のHEADERパラメーターがある場合は、次のようにAccess-Control-Allow-Headersに追加する必要があります。
<add name="Access-Control-Allow-Headers" value="Content-Type, X-Your-Extra-Header-Key" />
そして最後に、OPTIONSリクエストを処理するには、アプリケーションクラスを追加して空の応答で返信する必要があります。
protected void Application_BeginRequest()
{
if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS")
{
Response.Flush();
}
}
これにはすでに答えがありますが、私の解決策はここにあります。ウェブ設定では、<remove name="OPTIONSVerbHandler" />
への指示を削除する必要があります
最初にcustomHeadersを追加します
<httpProtocol>
<!-- THESE HEADERS ARE IMPORTANT TO WORK WITH CORS -->
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Methods" value="POST, PUT, DELETE, GET, OPTIONS" />
<add name="Access-Control-Allow-Headers" value="content-Type, accept, Origin, X-Requested-With, X-Authentication, name" />
</customHeaders>
</httpProtocol>
次に、OPTIONSverbHandlerを削除する指示をコメント化または削除します
<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>
私のために働いたソリューション:
これをweb.config(サーバー側)に追加します。
<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="GET, POST, PUT, DELETE, OPTIONS" />
</customHeaders>
</httpProtocol>
Global.asaxファイル(グローバルアプリケーションクラス)を作成し、次のコードを追加します。
protected void Application_BeginRequest(object sender, EventArgs e){
if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS")
{
Response.Flush();
}
}
IIS Team published IIS CORS module 空のメソッドのようなハックはもう必要ありません。プリフライトリクエストを含むCORSを適切に処理します。Web設定で設定できます例:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<cors enabled="true" failUnlistedOrigins="true">
<add Origin="*" />
<add Origin="https://*.Microsoft.com"
allowCredentials="true"
maxAge="120">
<allowHeaders allowAllRequestedHeaders="true">
<add header="header1" />
<add header="header2" />
</allowHeaders>
<allowMethods>
<add method="DELETE" />
</allowMethods>
<exposeHeaders>
<add header="header1" />
<add header="header2" />
</exposeHeaders>
</add>
<add Origin="http://*" allowed="false" />
</cors>
</system.webServer>
</configuration>
私はAJAXリクエストでxhr.setRequestHeader()
を削除することで同じ問題を解決しました。誰かがコードにある場合は、それを削除してみてください。