内部のみのインターフェイスで実行されている一連の 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