2017-08-01 12 views
2

私はWCF(.svc)WebServiceを使用していますが、完全に動作しています - 私はPostman、PHPなどから問題なく呼び出します。しかし、JavaScript/jQueryからAJAXを呼び出そうとすると、明らかに問題があります。私はWS以外のドメインからやっているので、やり遂げられません。JavaScriptからWCF WebServiceへのアクセス - プリフライト要求に対する応答がアクセス制御チェックに合格しない

これはすべてPOSTメソッドに関するものです。しかし、私のページが最初にOPTIONSメソッドを送信しても問題があります:

OPTIONS 'WSのADDRESS' 405(メソッド許可されていません)のXMLHttpRequestが'WSアドレスを' をロードすることはできません

プリフライトリクエストへの応答が アクセスコントロールチェックを通過していません:いいえ 'Access-Control-Allow-Origin'ヘッダーは、要求されたリソースに存在する です。 Origin 「マイアドレス」は、アクセスできません。 応答は、HTTPステータスコードに405

を持っていた詳細な回答があります。

Responses

さて、私はクロスドメインおよびWSのWeb.config読んで(必要があることのすべてが含まれていますか? )

Web.config

それは私のCに見えても、私はJavaScriptから私のWSに到達できないことを私が間違って何をやっているお聞かせくださいよく描かれた。しかし、それでもなお、これらの特別なヘッダーを返信しないようです...事前に感謝します。

+0

これは、サーバーがOPTIONS要求を禁止するように設定されていることを意味します。それは* Method Not Allowed *というメッセージの意味です。代わりに、200または204の成功メッセージと正しいAccess-Control-Allow- *ヘッダーでOPTIONS要求に応答するように構成する必要があります。それを行う方法については、より多くのドキュメントを読んでそれをさらに学習する必要があるように思えます。https://stackoverflow.com/questions/16024347/cross-origin-resource-sharing-for-c-sharp- wcf-restful-web-service-as-wind/16039951#16039951&https://stackoverflow.com/questions/43911702/405-method-not-allowed-wcf-service-and-ionic – sideshowbarker

答えて

1

XML HttpRequestを使用すると、Webサーバーからブラウザにデータを転送できます。ただし、ブラウザはデフォルトでCORSを防ぎます。 GET要求はサーバー側で何も変更されません(作成/更新/削除されるものは何もありません)。一部のデータを返すだけです。

しかし、POST/PUT/DELETEリクエストはリクエストを処理し、サーバー側で何かを変更してブラウザに応答します。応答に適切なAccess-Control-Allow-Originヘッダーがない場合、ブラウザーは応答をブロックします。しかし、それは重要ではありません。なぜなら、応答が発行されるまでに、サーバーはすでに要求を処理し、おそらくデータベースに変更を加えたからです。

サーバー側でPOST/PUT/DELETE要求を処理しないようにするため、ブラウザはpreflight requestを送信します。

prefligthリクエストは、OPTIONSメソッドを使用したhttpリクエストです。したがって、POSTリクエストを送信する前に、ブラウザはPOSTの値を持つAccess-Control-Request-Methodという追加のヘッダーとともにOPTIONSリクエストを送信します。

エラー405 (Method Not Allowed)は、サーバーがOPTIONS要求を受け入れるように構成されていないことを示します。

あなたはこれに似たウェブinvokeメソッドにワイルドカードを使用するか、この問題を解決することができます:

[OperationContract] 
[WebInvoke(Method = "*", UriTemplate = "/Path", ResponseFormat = WebMessageFormat.Json)] 

やオプションがこれに似たリクエスト処理するあなたの[ServiceContract]に追加[OperationContract]を追加することによって:

[OperationContract(Name = "OptionsMyFunction")] 
[WebInvoke(Method = "OPTIONS", UriTemplate = "/Path", ResponseFormat = WebMessageFormat.Json)] 
関連する問題