none
WCF Service WebRoleのクロスドメインポリシーファイルの配置について RRS feed

  • 質問

  • はじめて質問させていただきます。よろしくお願いいたします。

    現在、シルバーライトから、WCF Service WebRoleにアクセスするプログラムを作成しております。
    このプログラムを開発ファブリック上で実行すると、「・・・への要求試行時にエラーが発生しました。これは正しいクロスドメインポリシーを適用せずに・・・」というエラーが発生するため、WCFサイトにClientAccessPolicy.xmlを置けばよいのでは?と思うのですが、WCF Service WebRoleの場合は、クロスドメインポリシーファイルはどこに置けばよいのでしょうか?
    ※ちなみに現在、WebRoleプロジェクトの配下に配置しておりますが、うまく動作しません。


    環境:Windows7+VS2010RC+WindowsAzureToolsVer1.1

    2010年5月24日 5:13

すべての返信

  • おはようございます。

    私もそれで数日悩みました。おそらくクロスドメインポリシーファイルの配置は問題ないと思います。

    ただ、それだけでは動作しないので、以下のURLのHosting Silverilght Clientsの項目を参照してください。

    http://code.msdn.microsoft.com/wcfazure/Wiki/View.aspx?title=KnownIssues

    ちなみに、自分はSilverlightから以下のような感じでWCFサービスを呼び出しました。

    ------------------------------------------------

                Binding customBinding = new CustomBinding(new BinaryMessageEncodingBindingElement(), new HttpTransportBindingElement());
                EndpointAddress address = new EndpointAddress(new Uri(App.Current.Host.Source + "./../../Service.svc/binary"));
                var proxy = new ServiceReference1.Service2Client(customBinding, address);

    ------------------------------------------------

    なお、開発環境でデバッグするならパッチもあてたほうがよいと思います。

    2010年5月25日 0:21
  • bird98200さん、こんにちは早速のご回答ありがとうございます。
    今朝から、アドバイス頂いた内容①~③で、いろいろ試してはいるのですが、まだうまく動作しておりません。

    アドバイス頂いたURLの内容は、英語が得意ではないので、あまり詳しくはわからなかったのですが、
    以下のような内容かと思います。

    ①開発ファブリックやクラウド環境では「サービス参照の追加」や「svcutil」を使って、ただ単にWCFサービスをホストするプロキシを生成するだけではうまくいかない。=>WCFサービスの呼び出し方法
    ②パッチをあてる。
    ③ <service behaviorConfiguration="LoadBalancedBehavior" />をWeb.configファイルに追加する。
    と言った内容でしょうか?

    ①(WCFサービスの呼び出し方法)に関しては、以下のようにしてみました。

    Binding customBinding = new CustomBinding(new BinaryMessageEncodingBindingElement(), new HttpTransportBindingElement());
    EndpointAddress address = new EndpointAddress(new Uri(Application.Current.Host.Source + "./../WCFWebRole1/Service1.svc"));

    ServiceReference1.Service1Client Proxy = new ServiceReference1.Service1Client(customBinding,address);

    尚、現在のテスト環境では、シルバーライトはウエブロールに配置しておらず、ローカルのVSの開発サーバーで動作させているため、
    Uriの部分は以下の内容に書き換えて試してみましたが、やはりうまく動作しませんでした。

    Uri("http://127.0.0.1:81/Service1.svc" )


    尚、現在のエラーメッセージの内容は、クロスドメインに関するものではなく、
    以下の内容になっていましたので、テスト環境をもう少しシンプルにして、試してみたいと思います。

    CommunicationException was unhandled by user code
    リモートサーバーが次のエラーを返しました:NotFound。

     

    2010年5月25日 7:31
  • あまりお力になれずすみません。

    自分がテストした内容はb-oceanさんと同様の内容です。

    こちらのテスト環境ではSilverlightとWebロールを別ソリューションとして動作させても連携はできました。

    あと、すみません。質問にあったWCF Service WebRoleを使用しているという情報を見落としていました、自分はWCF Service WebRoleを使用していません。

    WCF Service webロールを使用するのではなく、webロールを作成して「webロールのプロジェクトを右クリック→add→new item→silverlight→silverlight-enabled WCF Service」で作成したテンプレートを使用してService.svcを公開してます。

    たぶん、これも実施してUriが正しければ自分のテスト内容とほぼ同一なので動くと思います。

    2010年5月26日 1:29
  • 私の開発環境では、WCF Service WebRole で Silverlight 4 からWCF 呼び出しができました。
    WCFのパッチも適用済みです。

    WCF Data Services からデータが取得できる大前提として、IE等のブラウザのアドレスに下記のアドレスにアクセスでき、xml ファイルが表示されることが前提となります。
    http://127.0.0.1:8080/crossaccesspolicy.xml

    動いた環境は、次のような構成になります。

    A. Silverlight プロジェクト
      Silverlight 本体

    B. ASP.NET Web Role
     Silverlihgt ホスティングサイト  
     デバッグ実行時のアドレス http://127.0.0.1:81/

    C. WCF Service WebRole
     WCF Data Services でWeb サービス提
     crossaccesspolicy.xml を配置
     デバッグ実行時のアドレス http://127.0.0.1:8080/

    ■Silverlight クライアントからのサービス呼び出し。
    WCF Data Services のメソッドを直接呼び出します。

    //データ取得
    protected void GetData()
    {
      //WCF Service Web Role の公開先Uriを直接指定
     DataServiceContext con = new DataServiceContext( new Uri(@"http://dev.local:8080/WcfDataService1.svc"));
    
     //エンティティクラス(SomeEntity)のソースコードは、WCFサービスサイトと同じクラスをSiliverlightプロジェクトにコピーして下さい。
     var qry = con.CreateQuery<SomeEntity>("SomeEntity");
    
     IAsyncResult r = q.BeginExecute( this.OnLoaded, qry);
    }
    
    //データ読み込み時
    private void OnLoaded(IAsyncResult ar)
    {
     var qry = (DataServiceQuery<SomeEntity>)ar.AsyncState;
     var entity = qry.EndExecute(ar);
    
     this.Dispatcher.BeginInvoke(
      delegate()
      { //UIに設定。※エラー処理は省略
       var arr = entity.ToArray();
       this.dataGrid1.ItemsSource = arr;
      }
     );
    }
    

    ■サービス参照について
    WCFサイトには直接サービス参照する事ができませんでした。
    恐らく bird982000さんが最初の返信でご指摘された開発環境の問題のせいかと思われます。

    対策については実証はしてませんが、下記でなんとかならないかなという推測です。少しでも解決のヒントになればと思ってお伝えいたします。

    WCF Data Services の ホストをインスタンス化しているのは、 System.Data.Services.DataServiceHostFactory ですのでこちらに開発環境で利用する Endpoint 追加すれば動くのではないかなと思います。
    Silverlight プロジェクトを別のソリューションで作成することで、Azure 開発環境WCF サイトをデバッグ実行しているサイトをからプロキシを作成することがそ可能です。ただ、開発中でWCFサービスが変わる度に両方起動しなければいけないので手間となりますが…

    • 編集済み Mayomayo 2010年5月26日 4:19 サービス参照方法修正
    2010年5月26日 3:48
  • bird98200さん、Mayomayoさん返信が遅れてしまってすみませんでした。
    (いろいろ出張が重なってしまい、時間がとれませんでした。)
    ご回答頂いた内容を参考しながら、いろいろ試してみたら、私も、WCF Service WebRole で Silverlight 4 からWCF 呼び出しができました。

    Mayomayoさんとの違いは、シルバーライトをホストするウエブサイトがローカルの
    デバッグサーバーということと、WCF Service WebRoleが、WCF Data Servicesではないところで、
    bird98200さんとの違いも、シルバーライトをホストするウエブサイトがローカルの
    デバッグサーバーということと、WCF Serviceの作成方法かと思います。
    (尚、私のVisual Studio 2010 は、RC版ではなく、RTM版でした。)

    WCFは、汎用性がある半面、動作するパターンが、思いの他たくさんあり自分の知りたい事の情報提供が足りていなかったにもかからず、ご親切にいろいろ教えて頂き、本当にありがとうございました。
    お陰さまで、なんとかクリアーできました。今後ともよろしくお願いいたします。


    【プロジェクト構成】
    ①シルバーライトアプリケーションプロジェクト(Silverlight 本体)
    ②シルバーライトホストウエブサイトプロジェクト(ASP.NET)
     ・・・①をつくると自動的にできるプロジェクト
     ※デバッグ時アドレスhttp://localhost:50978/SilverlightTestPage.aspx
    ③WCF Service WebRoleプロジェクト
    ④クラウドプロジェクト
     ・・・③をつくると自動的にできるプロジェクト
     ※デバッグ時アドレスhttp://127.0.0.1:81/Service1.svc


    【主な注意点】
    1.クロスドメインポリシーファイル(ClientAccessPolicy.xml)は③のプロジェクト直下に配置します。

    2.②と④をマルチスタートアップに設定してデバッグ実行します。
     ・②http://localhost:50978/SilverlightTestPage.aspx
     ・④http://127.0.0.1:81/Service1.svc

    3.③WCF Service WebRoleプロジェクトのサービスビヘイビアでAddressFilterModeにAnyを指定する。

        [ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]
         public class Service1 : IService1
        {
            public string hello()
            {
                return ("hello! ");
            }
        }


    【環境】
    Microsoft Visual Studio 2010 RTM
    Windows Azure Tools v1.1.30131.1501 (2/2010) RC
    Silverlight4

     

    2010年5月29日 14:52