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地址。值得注意的是,该方法仅能支持应用与服务在相同域中,如果服务在不同的域中,必须进行跨域设置才能完成动态设置。
上一篇: 葛根粉虽营养不可乱吃 搭配错误竟会中毒