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地址。值得注意的是,該方法僅能支持應用與服務在相同域中,如果服務在不同的域中,必須進行跨域設置才能完成動態設置。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM