DotNetEden

一个普通程序员的成长记录
posts - 440, comments - 1502, trackbacks - 13, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

做过Silverlight项目的朋友都知道一般来说我们在Silverlight项目中都需要引用WebService或是WCF,引用的方式是在Visual Studio窗口中通过“添加服务引用”来添加引用,这时Visual Studio会生成一个 ServiceReferences.ClientConfig 配置文件,这个文件中存储了WebService的地址,绑定等信息,我们在Silverlight中实例化WebService的代理类时需要用到这个文件,没有这个文件WebService代理类的实例化就会失败。

使用ServiceReferences.ClientConfig的方式来实例化WebService代理类比较简单,但是也有一个缺点,就是每次将Silverlight项目上线时都需要手工打开生成的XAF包,将ServiceReferences.ClientConfig文件中的WebService地址从http://Localhost/YourProject/YourWebService.asmx的形式改为http://YourDomain/YourProject/YourWebService.asmx,如果某次你忘记了修改,可能会导致你的Siverlight项目在线上无法正常运行。那么有没有一种简单的方式让我们不需要每次上线都修改ServiceReferences.ClientConfig文件,让我们摆脱对ServiceReferences.ClientConfig的信赖呢?下面就说一下我的实现方式。

实现原理很简单,就是在一个类里手工的构造WebService的EndPoint, Binding等信息,将ServiceReferences.ClientConfig的作用用代码来代替,示例实现代码如下,代码很简单,各位一看就明白。

View Code
 1 	///<summary>
2 /// 得到WebService对象
3 /// 以后实例化WebService代理时请用var serviceClient = Utility.GetDesignerServiceInstance();的形式,
4 /// 不要再用默认的 var serviceClient = new WSDesignerSoapClient();
5 /// 后一种形式会报错,因为我们删除了ServiceReferences.ClientConfig文件
6 ///</summary>
7 ///<returns></returns>
8 public static WSDesignerSoapClient GetDesignerServiceInstance()
9 {
10 var basicBinding = new BasicHttpBinding() { MaxBufferSize = int.MaxValue, MaxReceivedMessageSize = int.MaxValue, Name = "WSDesignerSoap" };
11 basicBinding.Security.Mode = BasicHttpSecurityMode.None;
12 var endPoint = new EndpointAddress(getHostUrl() + "/WebService.asmx");
13 var ctor =
14 typeof (WSDesignerSoapClient).GetConstructor(new Type[] {typeof (Binding), typeof (EndpointAddress)});
15 return (WSDesignerSoapClient) ctor.Invoke(new object[] {basicBinding, endPoint});
16 }
17
18
19 ///<summary>
20 /// 得到当前所在网站的根目录,如Http://localhost/flow
21 /// 注意站点名字必须是Flow,否则会报错。
22 ///</summary>
23 ///<returns></returns>
24 private static string getHostUrl()
25 {
26 var location = (HtmlPage.Window.GetProperty("location")) as ScriptObject;
27 var hrefObject = location.GetProperty("href");
28 string url = hrefObject.ToString().Substring(0, hrefObject.ToString().IndexOf("Flow/") + 5);
29 return url;
30 }

PS:本文在写作中参考了:[Silverlight]摆脱对 ServiceReferences.ClientConfig 的依赖

作者:张荣华
出处:http://zhangronghua.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
标签: Silverlight

Feedback

#1楼  回复 引用 查看   

2011-11-23 08:39 by 济阳补丁      
如果是分布式部署,何如?

#2楼[楼主]  回复 引用 查看   

2011-11-23 08:46 by 张荣华      
@济阳补丁
啥叫分布式部署?服务和Asp.Net网站不在一个服务器上?如果这样的话,只要参考http://www.cnblogs.com/zhangronghua/archive/2011/07/07/SilverLightCorssDomainIssue.html这个就行

#3楼  回复 引用 查看   

2011-11-23 08:46 by 阿水      
顶一记
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 2258675 cH5TwLWJvBI=