HTMLを配置しているサーバーとは別のサーバーにWCFサービスを立ち上げており、HTMLのJavascriptからWCFサービスを呼び出すと、
405 メソッドは許可されていません。
というエラーが発生してしまいます。
クロスドメインというものをよく理解していなかったので、結構ハマりました。
CORS
どうやら、Cross Origin Resource Sharing(CORS)という仕組みへの対応が必要らしい。WCFサービスを立ち上げているドメインとは別のドメインからアクセスされた場合に、アクセス元のWebサイトを特定することで、悪意のあるWebサイトからの接続を防ごう、というものらしいです。
アクセス可能なドメインについては別途許可する仕組みが必要とのこと。
じゃあ具体的に何をすれば良いのよ?ってのがよくわかりませんでした。
IISのHTTP応答ヘッダーを設定
IISのHTTP応答ヘッダーの設定で対応可能との情報があったので、とりあえず設定してみる。IISの「サイト」をクリック → 「HTTP応答ヘッダー」 → 「追加」
以下の3つの設定を追加。
※Access-Control-Allow-Originはテスト用にとりあえず「*」
しかし、これだけでは繋がりませんでした。
プリフライトリクエスト(preflight request)への対応
CORSの仕様として、HTTPリクエストを送る前に「OPTIONS」リクエストを送る「プリフライトリクエスト(preflight request)」というものがあるそうです。プリフライトリクエストを送るかどうかはブラウザが決めています。
このOPTIONSリクエストを受ける受け口がWCFサービスに無いので、エラーとなっていました。
ということで以下のコードを追加しました。
元のソースはこちらを参照
' ソース:IService.vb ' 追加コード:OPTIONSリクエスト用メソッド <OperationContract(), WebInvoke(Method:="OPTIONS" _ , BodyStyle:=WebMessageBodyStyle.Wrapped _ , RequestFormat:=WebMessageFormat.Json _ , ResponseFormat:=WebMessageFormat.Json _ , UriTemplate:="/call")> Function OptionsMethod() As Boolean
' ソース:Service.svc.vb ' 追加コード:OPTIONSリクエスト用メソッド(とりあえずTrueを返すだけ) Public Function OptionsMethod() As Boolean _ Implements IService.OptionsMethod Return True End Function上記IISのHTTP応答ヘッダー設定とプリフライトリクエスト対応で、クロスドメインからWCFサービスに接続が可能となりました。
以上
0 件のコメント :
コメントを投稿