Silverlight動的設定WCFサービスEndpoint



昨年12月、SilverlightがWCFサービスを利用しているという友人からのメールが届き、アプリケーションが導入されてからアクセスできなかった問題について、何度かのコミュニケーションを通じて、彼のプロジェクトでは、すべて静的URLをWCFサービスのEndpointアドレスとして使用していたが、その後、動的アドレスに変更された後、問題が解決したことが分かった.この記事では、ダイナミックWCF Endpointの作成方法について簡単に説明します.
SilverlightプロジェクトにおいてWCFサービスによりサーバ側データとのインタラクションを行う方法は、Silverlightクライアントにサービス参照(Service Reference)を追加することであり、SilverlightはクライアントプロジェクトにServiceReferenceという名前のサービスを生成する.ClientConfigのプロファイル.このプロファイルにはWCFサービスのEndpoint URLアドレスが含まれており、Silverlightクライアントサービス要求を対応するサーバ側サービスインタフェースに導く.デフォルトでは、クライアントが生成するEndpointアドレスはlocalhostであり、アプリケーションがパブリッシュされると、Webサーバの構成によって変更されます.
デフォルト設定として、Webサーバの構成が切り替わるたびに、開発者はWCFサービスの構成を手動で変更する必要があり、SilverlightアプリケーションはServiceReferenceに完全に依存することはできません.ClientConfig構成.これにより、メンテナンスコストが増加するだけでなく、コードメンテナンスに難易度が追加されます. 
まずプロジェクトにWCFサービスを追加し、SilverlightはデフォルトでServiceReferenceを生成します.ClientConfigファイルは、プロファイルからEndpointがローカルを指していることがわかります.
 
<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_ProxyService" maxBufferSize="2147483647"                     maxReceivedMessageSize="2147483647">
                    <security mode="None" />
                binding>
                <binding name="BasicHttpBinding_WidgetService" maxBufferSize="2147483647"                     maxReceivedMessageSize="2147483647">
                    <security mode="None" />
                binding>
            basicHttpBinding>
        bindings>
        <client>
            <endpoint address="http://localhost/WCFTest/Proxy.svc"                 binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ProxyService"                 contract="WCFTestProxy.ProxyService" name="BasicHttpBinding_ProxyService" />
            <endpoint address="http://localhost/WCFTest/Widget.svc"                 binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_WidgetService"                 contract="WCFTestWidgetService.WidgetService" name="BasicHttpBinding_WidgetService" />
        client>
    system.serviceModel>
configuration>

 
動的にEndpointを設定するには、次の補助クラスDynamicEndpointHelperを作成します.
public class DynamicEndpointHelper {     // BaseUrl      Web     
    private const string BaseUrl = "http://localhost/WCFTest/";      public static string ResolveEndpointUrl(string endpointUrl, string xapPath)     {         string baseUrl = xapPath.Substring(0, xapPath.IndexOf("ClientBin"));         string relativeEndpointUrl = endpointUrl.Substring(BaseUrl.Length);         string dynamicEndpointUrl = baseUrl + relativeEndpointUrl;         return dynamicEndpointUrl;     } }

Silverlightクライアントでは、バックグラウンドコードで動的にEndpointを設定することができます.
private WCFTestProxy.ProxyServiceClient GetProxyService() {     WCFTestProxy.ProxyServiceClient service = new WCFTestProxy.ProxyServiceClient();     service.Endpoint.Address = new EndpointAddress(         DynamicEndpointHelper.ResolveEndpointUrl(service.Endpoint.Address.Uri.ToString(),         App.Current.Host.Source.ToString()));     return service; }

プロキシクライアントサービスの作成が完了すると、Endpointアドレスは現在実行中のWebアドレスを指します.この方法は、サービスと同じドメインでのみ適用をサポートし、サービスが異なるドメインにある場合は、動的設定を完了するには、ドメイン間設定が必要であることに注意してください.