2011-02-07 10 views
0

私は、サーバーとの通信にWCFを使用するSilverlightアプリケーションを使用しています。 SilverlightとWCFの両方がローカルマシン(localhost)上で実行されています。 Silverlightがサービスに呼び出しを行うと、通信例外が発生して失敗します。 これは私がclientaccesspolicyファイルを持っていないためですが、WCFエンドポイントがhttp://localhost:portで実行されているため、IPolicyRetriverというインターフェースを定義して、ストリームにclientaccesspolicyを返す実装をそのサービスに追加しました。Silverlight - WCFがlocalhost上でclientaccesspolicyを取得する

私の質問は、問題なく動作するように設定する必要がありますか? ServiceReference.ClientConfigファイルに何かを変更したり追加したりする必要があることを理解していますが、何が理解できません。以下に私のServiceReference.ClientConfigを含めました。私は何を変更するか、それに追加するか、Silverlightでこのコードを追加する場所を教えてください。 ここにリンクを貼ってはいけません。最後の2日間にできるすべてのリンクを開いていますが、まだ分かりません。

<configuration> 
<system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
      <binding name="BasicHttpBinding_IMapService" maxBufferSize="2147483647" 
       maxReceivedMessageSize="2147483647"> 
       <security mode="None" /> 
      </binding> 
     </basicHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="../MapService.svc" binding="basicHttpBinding" 
      bindingConfiguration="BasicHttpBinding_IMapService" contract="MapService.IMapService" 
      name="BasicHttpBinding_IMapService" /> 
    </client> 
</system.serviceModel> 

HELP ME PLEASE!

答えて

0

サービスの設定やコードを変更する必要はありません。 clientaccesspolicy.xmlをサービスWebサイトのROOTに配置します。 Visual Studioを使用している場合は、これを機能させるためにプロパティを変更する必要があります。 Silverlightはファイルの存在を探します。私は、Fiddlerのようなツールを使って、Silverlightがファイルを探している場所を知ることができます。

非常に参考になったリンクが1つありますが、リンクが必要ないので、私はそれを提供しません。

+0

私はROOT of serviceのウェブサイトを持っていません。私はlocalhost上でそれを実行しています。そして、あなたは正しい変化をどういう意味ですか?フィドラーの使い方は? – gln

+0

はい、ローカルホストの場合でもルートがあります。 "htt p:// localhost:PortNumber /"はルートで、Silverlightはclientaccesspolicy.xmlファイルを検索します。私が正しく覚えていれば、プロパティの変更は、Visual Studioのサイトプロパティページの "Web"タブからバーチャルパスを "/"に設定することです。 – DaveB

1

あなたが言及したIPolicyRetriever実装は含まれていませんが、ここでは使用できるサンプルがあります。

インターフェース仕様:

[ServiceContract] 
public interface IPolicyRetriever 
{ 
    [OperationContract, WebGet(UriTemplate = "/clientaccesspolicy.xml")] 
    Stream GetSilverlightPolicy(); 

    //[OperationContract, WebGet(UriTemplate = "/crossdomain.xml")] 
    //Stream GetFlashPolicy(); 
} 

インタフェースの実装:

// IPolicyRetriever implementation 
    private Stream StringToStream(string result) 
    { 
     WebOperationContext.Current.OutgoingResponse.ContentType = "application/xml"; 
     return new MemoryStream(Encoding.UTF8.GetBytes(result)); 
    } 

    public Stream GetSilverlightPolicy() 
    { 
     string result = @"<?xml version=""1.0"" encoding=""utf-8""?> 
      <access-policy> 
      <cross-domain-access> 
       <policy> 
       <allow-from http-request-headers=""*""> 
        <domain uri=""*""/> 
       </allow-from> 
       <grant-to> 
        <resource path=""/"" include-subpaths=""true""/> 
       </grant-to> 
       </policy> 
      </cross-domain-access> 
      </access-policy>"; 

     return StringToStream(result); 
    } 

次に、あなたのサーバの設定XMLファイルに以下のものを含むことができます。これは、クライアント側ではなくサーバー側で行う必要があります。私はあなたの質問に上記のクライアントの設定を含めたので、これを強調しています。

また
<behaviors> 
    <endpointBehaviors> 
    <behavior name="WebHttpNewBehavior"> 
     <webHttp /> 
    </behavior> 
    </endpointBehaviors> 
    ... 
</behaviors> 
<services> 
    <service behaviorConfiguration="NewBehavior"> 
    <endpoint behaviorConfiguration="WebHttpNewBehavior" binding="webHttpBinding" 
       bindingConfiguration="" name="PolicyEndpoint" contract="WCFService.IPolicyRetriever" /> 
    ... 
    </service> 
</services> 

あなたがプログラムであなたのホストを作成することにした場合(これはむしろClientConfigファイルを使用するよりも、私はそれを行う方法であるので、上記のサンプルは、100%正確でない場合があります):

ServiceHost host = new ServiceHost(serviceType); 
host.AddServiceEndpoint(typeof(IPolicyRetriever), new WebHttpBinding(), "").Behaviors.Add(new WebHttpBehavior()); 

リンクを提供しないように頼んだことは知っていますが、今度はSilverlight/WCFプロジェクトへのアクセス権がないため、http://blogs.msdn.com/b/asiatech/archive/2010/05/07/how-to-consume-a-self-hosted-wcf-service-in-a-cross-domain-environment-by-silverlight-client.aspxを参考にしてメモリをリフレッシュしています。

+0

どこにServiceHost ...コードを配置する必要がありますか? – gln

+0

Silverlightコンポーネントからアクセスするには、WCFサーバーのどこかにServiceHostを作成しておく必要があります。 XML設定を使用してServiceHostを作成する場合は、コードをどこでも使用する必要はありません。代わりにXMLを使用できます。 – dlanod

+0

getSilverlightPolicyを呼び出す必要がありますか?はいの場合 - どこに?もしそうでなければ、銀河はどうやってそれを呼び出すのか知っていますか? – gln

関連する問題