去年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地址。值得注意的是,该方法仅能支持应用与服务在相同域中,如果服务在不同的域中,必须进行跨域设置才能完成动态设置。

Silverlight动态设置WCF服务Endpoint相关推荐

  1. silverlight动态创建WCF服务

    最近在发布silverlight项目时,服务地址不是固定,因此服务需要动态创建.在网上搜了点资料找到了动态创建服务的方法,直接上代码 /// <summary>/// 根据服务类型创建服务 ...

  2. SilverLight学习笔记--WCF服务

    编写WCF服务接口 using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Se ...

  3. Silverlight与WCF之间的通信(5)silverlight应用和wcf服务的发布方法

    上一篇博文中有朋友问到关于silverlight程序发布的问题,上一篇写的是silverlight访问host在console上的wcf,其实关于wcf和silverlihgt通信的问题有好几种方式, ...

  4. 动态调用WCF服务[转]

    原文地址:http://blog.csdn.net/castlooo/archive/2010/05/06/5562619.aspx 客户端调用wcf ,有时需要动态的调用服务端的WCF中的方法,本方 ...

  5. 客户端动态调用WCF服务中的方法

    首先要写一个执行动态调用的方法:在里面实现反射调用. public static object ExecuteMethod<T>(string pUrl,string pMethodNam ...

  6. 寄宿于CS程序的WCF服务

    最近项目中,需要对外部程序提供服务接口,用来进行数据交互和部分设备控制.由于都是使用的.NET平台开发的,因此想到使用WCF服务.之前也用过WCF服务,但是当初使用的时候是通过IIS寄宿的,有些地方不 ...

  7. Silverlight与WCF之间的通信(4)silverlight以net.tcp方式调用console上寄宿的wcf服务

    (由于最近是针对一个demo进行的研究,在之前公开过代码结构,这里只是对需要改动的地方加以说明) WCF4.0使得编写wcf服务不再那么复杂,去掉了许多的配置信息,客户端只需要一个服务地址,便可在系统 ...

  8. linux c调用wcf服务,Silverlight+WCF实现跨域调用

    在这篇文章中,WCF扮演服务器,向外提供LoginVaild服务:Silverlight扮演客户端,调用WCF提供的LoginVaild服务.思路有了,下面进行代码实现. 数据库脚本实现 新建T_Us ...

  9. WCF 服务端+客户端动态调用

    最近在写WCF服务相关代码,把项目中用到的通讯框架做了下整理,以备以后自己记忆. WCF服务端: 包含契约定义:WCF.Contract.契约实现:WCF.Service 以及宿主主程序:WcfSer ...

最新文章

  1. Jackson——来自官网的翻译
  2. bs和cs架构的区别和优缺点_C/S和B/S两种架构区别与优缺点分析
  3. Model层视频播放关闭问题及手机视频播放的适配问题解决方案
  4. 嵌入式linux开发业内各个常用开源项目git仓库地址大全
  5. 如何现实CITRIX XenAPP内容重定向
  6. g++ 编译mysql动态库_Linux下g++编译以及使用静态库和动态库的方法详解
  7. python 取整_马克的Python学习笔记#数字,日期和时间
  8. JS键盘事件最全keycode代码
  9. myeclipse jsp头
  10. Linux 常用开关机以及7个启动级别
  11. Eclipse中导入maven项目 maven update project报“Cannot nest ‘xx/src/main/resources‘ inside ‘xx/src ……”
  12. 求素数的python程序_Python编程新手看过来,如何求素数 (Python学习教程)
  13. [NLP论文阅读]A SIMPLE BUT TOUGH-TO-BEAT BASELINE FOR SENTENCE EMBEDDINGS
  14. matepad和鸿蒙,华为MatePadPro配置速看:搭载了鸿蒙系统的它真比iPadPro强?
  15. java 夏令时区_java中的夏令时
  16. 学习java的第十九天,static关键字、隐匿代码块的学习
  17. git仓库迁移(阿里云git切换到公司内部的gitlab)
  18. 苹果充电时一充一停怎么办_苹果充电线一会儿能充一会儿不能充怎么回事
  19. 【验证码的识别】—— 极验验证码的识别
  20. Visual Studio打开文件时出现“向程序发送命令时出现问题

热门文章

  1. 服务器虚拟化北向,KVM虚拟化的部署及使用
  2. 获取SpringBean对象工具类
  3. php文件的标准格式化,PHP获取文件大小并格式化的几种方法
  4. gitlab数据迁移
  5. 高并发下的redis击穿,你需要了解下布隆过滤器
  6. android NinePatch图片制做
  7. linux stm32 主从,STM32F407和STM32F051主从I2C通信方法
  8. php 时间转换编号,PHP 时间的格式转换
  9. Python测试框架pytest(03)setup和teardown
  10. date javascript 时区_js Date 时间戳 时区等问题总结