WCFサービスのクロスドメイン対応


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はテスト用にとりあえず「*」
  • Access-Control-Allow-Headers : accept, content-type
  • Access-Control-Allow-Methods : GET,POST,OPTIONS
  • 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 件のコメント :

コメントを投稿