Silverlight動的設定WCFサービスEndpoint
11509 ワード
昨年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アドレスを指します.この方法は、サービスと同じドメインでのみ適用をサポートし、サービスが異なるドメインにある場合は、動的設定を完了するには、ドメイン間設定が必要であることに注意してください.