欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Silverlight动态设置WCF服务Endpoint

程序员文章站 2022-03-30 18:01:45
silverlight项目中通过wcf服务进行客户端与服务器端数据交互,其方法是在silverlight客户端添加服务引用(service reference),silverlight会在客户端项...
Silverlight动态设置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.s"                 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地址。值得注意的是,该方法仅能支持应用与服务在相同域中,如果服务在不同的域中,必须进行跨域设置才能完成动态设置。