2

内部のみのインターフェイスで実行されている一連の WCF Web サービスがあり、これらは他の多くの Web サイト (これも内部のみ) によって呼び出されます。ドメイン名は一致しますが、ポート番号が異なるだけです。

私はこれらの Web サービスに対して AJAX POST 要求を作成していますが、技術的には同じオリジン (異なるポート) ではないため、CORS を使用しています。

IEではすべて問題ありませんが(IEはポートを異なるオリジンとして扱わないと私は信じているため)、OperaとFirefoxの両方がプリフライト OPTIONS リクエストを送信します。

web.config ファイルを介してこれらの要求を受け入れるように Web サービスを構成しました。

<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Methods" value="POST, GET, OPTIONS" />
<add name="Access-Control-Allow-Headers" value="*" />

また、HTTP 動詞を受け入れるようにサービスのインターフェイスを設定しました。

[OperationContract(Name = "H2dbDataExport")]
[WebInvoke(Method = "*", BodyStyle = WebMessageBodyStyle.Wrapped, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
string H2dbDataExport(string action, string username, exportDetails data);

ただし、これにより、基になるサービスが呼び出され、POST 要求で期待される詳細が見つからないため、標準の「You sent something wrong」応答が返されます。

POSTリクエストのみを受け入れるようにサービスを変更すると、これは実際には次の方法で同じもので応答する唯一の応答です。

[WebInvoke(Method = "POST", etc.......

次に、プリフライト OPTIONS は「405 - メソッドは許可されていません」という応答を受け取ります。

私は何を間違っていますか?OPTIONS リクエストに応答するようにサービスを構成する必要がありますか? もしそうなら、正しい応答は何でしょうか?

サービスでリクエストタイプを取得して200で返信できると想定しています-動詞がOPTIONSの場合は実際のPOSTを再送信します-しかし、手動でこれを行った場合、ブラウザーはOPTIONSを次のように再度送信します新しいリクエストです。

編集:

WEbDAV ハンドラーの削除に関するこの投稿を見つけました: CORS 405 (メソッドは許可されていません)

しかし、それは役に立ちませんでした。

OPTIONSHttpVerb ハンドラーをリストの一番上に移動し、「読み取り」権限を付与することに関する投稿もありましたが、これも役に立ちませんでした。

編集 2: 実際に OPTIONSHttpVerb を移動すると、Web サービスが呼び出されなくなりましたが、IIS は 200 - OK で応答します。ただし、この応答は依然としてブラウザーのクライアント コードで終了するため、役に立ちません。

OPTIONS 応答

HTTP/1.1 200 OK
Allow: OPTIONS, TRACE, GET, HEAD, POST
Server: Microsoft-IIS/7.5
Public: OPTIONS, TRACE, GET, HEAD, POST
X-Powered-By: ASP.NET
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Headers: *
Access-Control-Max-Age: 1728000
Date: Fri, 05 Jun 2015 10:34:29 GMT
Content-Length: 0
4

2 に答える 2

2

コメントするには十分なカルマがないので、私のようにこの質問と回答に来た人のためにここに置いておきます.OPTIONSリクエストが成功した後、IE11はPOSTリクエストを送信しません(200 OK)

私にとってうまくいかなかった理由は、応答ヘッダーがケース化されていたのに対し、要求ヘッダーはケース化されていなかったためです。

リクエスト ヘッダー:

Access-Control-Request-Headers: content-type, accept

応答ヘッダー:

Access-Control-Allow-Headers: Content-Type, Accept

これは HTTP/1.1 標準 BTW の違反です。https: //stackoverflow.com/a/5259004/1602497 を参照してください。

于 2016-08-24T12:57:29.423 に答える