去年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="BasicHttpBinding_WidgetService"clientendpoint address="http://localhost/WCFTest/Proxy.svc" binding="basicHttpBinding" bindingConfiguration contract="WCFTestProxy.ProxyService" name="BasicHttpBinding_ProxyService" /> ="http://localhost/WCFTest/Widget.svc"="WCFTestWidgetService.WidgetService"="BasicHttpBinding_WidgetService" /> > >
为了实现动态设置Endpoint,下面将创建一个辅助类DynamicEndpointHelper,
public class DynamicEndpointHelper
{
// BaseUrl是部署服务的Web服务器地址
private const string BaseUrl = "http://localhost/WCFTest/";
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;
}
}