Silverlight中的ServiceReferences.ClientConfig
        做过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项目在线上无法正常运行。

        实现原理很简单,就是在一个类里手工的构造WebService的EndPoint, Binding等信息,将ServiceReferences.ClientConfig的作用用代码来代替,示例实现代码如下,代码很简单,各位一看就明白。
///<summary>
/// 得到WebService对象
/// 以后实例化WebService代理时请用var serviceClient = Utility.GetDesignerServiceInstance();的形式,
///     不要再用默认的 var serviceClient = new WSDesignerSoapClient();
/// 后一种形式会报错,因为我们删除了ServiceReferences.ClientConfig文件
///</summary>
///<returns></returns>
       public static WSDesignerSoapClient GetDesignerServiceInstance()
       {
           var basicBinding = new BasicHttpBinding() { 
                                                       MaxBufferSize = int.MaxValue, 
                                                       MaxReceivedMessageSize = int.MaxValue, 
                                                       Name = "WSDesignerSoap" 
                                                      };
           basicBinding.Security.Mode = BasicHttpSecurityMode.None;
           var endPoint = new EndpointAddress(getHostUrl() + "/WebService.asmx");
           var ctor =
               typeof (WSDesignerSoapClient).GetConstructor(new Type[] {typeof (Binding), typeof (EndpointAddress)});
           return (WSDesignerSoapClient) ctor.Invoke(new object[] {basicBinding, endPoint});
       }

       ///<summary>
/// 得到当前所在网站的根目录,如Http://localhost/flow
/// 注意站点名字必须是Flow,否则会报错。
///</summary>
///<returns></returns>
       private static  string getHostUrl()
      {
            var location = (HtmlPage.Window.GetProperty("location")) as ScriptObject;
            var hrefObject = location.GetProperty("href");
            string url = hrefObject.ToString().Substring(0, hrefObject.ToString().IndexOf("Flow/") + 5);
            return url;
       }

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

  本文来自张荣华的博客,原文地址:http://www.cnblogs.com/zhangronghua/archive/2011/11/22/SilverlightRemoveConfigDependency.html



阅读更多
个人分类: Others
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

Silverlight中的ServiceReferences.ClientConfig

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭