Silverlight动态设置WCF服务Endpoint
2013-02-02 05:57 by jv9, 1763 阅读, 3 评论, 收藏, 编辑

去年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地址。值得注意的是,该方法仅能支持应用与服务在相同域中,如果服务在不同的域中,必须进行跨域设置才能完成动态设置。
转自:http://www.cnblogs.com/jv9/archive/2013/02/02/2889738.html
Silverlight动态设置WCF服务Endpoint的更多相关文章
- 动态调用WCF服务
动态调用WCF服务,只需要提供*.svc地址, 1:命名空间: using System.ServiceModel.Channels;using System.ServiceModel; 2:创建访问 ...
- Silverlight客户端调用WCF服务难题解疑
一:解决办法 Silverlight客户端调用WCF服务在实际使用中经常会出现的问题就是无法直接应用类文件和配置文件.微软针对这一情况已经给出了解决办法.WCF开发框架可以帮助我们实现可靠性较高的跨平 ...
- 检测WCF服务是否在线(动态执行WCF服务)
在我们的系统里有多个wcf支撑.但是有的时候会莫名的停止,于是今天写了一个服务,定时去检测其他wcf服务是否在线.那么最简单的办法自然是引用其他wcf服务让vs给我们自动生成clientProxy然后 ...
- 记录:Web无引用无配置方式动态调用WCF服务
这几年一直用WebApi较多,最近项目中有个需求比较适合使用WCF,以前也用过JQuery直接调用Wcf的,但是说实话真的忘了… 所以这次解决完还是花几分钟记录一下 WCF服务端:宿主在现有Win服务 ...
- 基于MSMQ绑定的WCF服务实现总结
一. 创建消息队列 1 1) 创建一个非事物性的私有队列 1 2)设置消息队列访问权限 2 二.创建WCF服务并绑定消息队列 4 1)创建HelloService服务 4 ...
- 学习之路十四:客户端调用WCF服务的几种方法小议
最近项目中接触了一点WCF的知识,也就是怎么调用WCF服务,上网查了一些资料,很快就搞出来,可是不符合头的要求,主要有以下几个方面: ①WCF的地址会变动,地址虽变,但是里面的逻辑不变! ②不要引用W ...
- WCF 服务的集合管理器的设计
今天是2019年2月1日,时间过得针对,马上就年底了,当前新年也离我们越来越近了.在此,我也祝福经常浏览我博客的朋友们“新年快乐.阖家欢乐”,来年有一个好彩头.在即将结束这一年之计,写今年的最后一片文 ...
- 创建一个简单的WCF程序2——手动开启/关闭WCF服务与动态调用WCF地址
一.创建WCF服务器 1.创建WCF服务器的窗体应用程序 打开VS2010,选择文件→新建→项目菜单项,在打开的新建项目对话框中,依次选择Visual C#→Windows→Windows窗体应用程序 ...
- 动态调用webservice及WCF服务
动态调用web服务,该方法只针对Web service, WCF的服务不行,如果是WCF的就通过工具直接生产代理类,把代理类配置到调用的项目中,通过配置客户端的终结点动态的取实现: 通过Svcutil ...
随机推荐
- Kinect测量人体身高的程序
对着书上敲得,从中体会kinect骨骼识别与深度识别的原理.大体原理是懂了,但有些细节还没有完全弄明白. using System; using System.Collections.Generic; ...
- rman异机恢复(RAC双节点恢复到单节点)
一.数据库全备 RUN {ALLOCATE CHANNEL ch00 DEVICE TYPE disk;ALLOCATE CHANNEL ch01 DEVICE TYPE disk;backup as ...
- (转)Combobox出现System.Data.DataRowView的原因,以及指定ValueMember的时机问题
原文地址 http://blog.csdn.net/lubiaopan/article/details/5915774 当使用Combobox控件时,出现SelectedValue的值为“System ...
- 一个关于发邮件的类,可以模拟发送对smtp服务器或者是本地文件夹
namespace SportsStore.Domain.Concrete { public class EmailSettings { public string MailToAddress = & ...
- HDU1325
http://acm.split.hdu.edu.cn/showproblem.php?pid=1325 #include<stdio.h> #include<algorithm&g ...
- 调用WEKA包进行kmeans聚类(java)
所用数据文件:data1.txt @RELATION data1 @ATTRIBUTE one REAL @ATTRIBUTE two REAL @DATA 0.184000 0.482000 0.1 ...
- java中HashMap的用法
重点介绍HashMap.首先介绍一下什么是Map.在数组中我们是通过数组下标来对其内容索引的,而在Map中我们通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做value.在下文中会 ...
- malloc、calloc、realloc的区别
(1)C语言跟内存分配方式 <1>从静态存储区域分配. 内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量.static变量.<2> ...
- HDOJ1010(BFS)
//为什么bfs不行呢,想不通 #include<cstdio>#include<cstring>#include<queue>using namespace st ...
- Hibernate 问题,在执行Query session.createQuery(hql) 报错误
在配置文件中加入 <prop key="hibernate.query.factory_class">org.hibernate.hql.internal.classi ...