Silverlight调用WebService 之 Silverlight动态加载外部XML指定地址的WebService---(动态加载外部XML文件中指定的WebService地址)

Silverlight调用WebService 之 Silverlight动态加载外部XML指定地址的WebService---(动态加载外部XML文件中指定的WebService地址),第1张

概述1. 前一段时间接手PL公司的SL项目,看了一下他们调用WebService的方法,有点不解,为什么要这么麻烦呢,今天偶尔看到了一篇文章,恍然大悟,转载一下 Silverlight可以加载外部的XML文件里面的内容,那么我们可不可以在外部XML里面配置一个WebService地址,并且以此加载这个地址来动态加载WebService呢?这样子就可以避免当WebService地址改变的时候,还要打开X

1. 前一段时间接手PL公司的SL项目,看了一下他们调用WebService的方法,有点不解,为什么要这么麻烦呢,今天偶尔看到了一篇文章,恍然大悟,转载一下

Silverlight可以加载外部的XML文件里面的内容,那么我们可不可以在外部XML里面配置一个WebService地址,并且以此加载这个地址来动态加载WebService呢?这样子就可以避免当WebService地址改变的时候,还要打开XAP包来重新修改WebService配置的地址了。

    答案当然是可以的。在这里,我制作了一个实例。

    在前面一节里面,我们讲到了使用WebClIEnt来下载Silverlight程序外部的XML文件内容。在本节中,我们重点需要讲解一下如何使用反射来动态生成WebService代理类。关键代码如下:

public  static Servicename  InitializeServices( string  serviceAddress)        {            BasichttpBinding basicBinding = new  BasichttpBinding(); @H_403_48@//创建BasichttpBinding绑定类 basicBinding.MaxBufferSize = 2147483647; //设置最大缓存字节 basicBinding.MaxReceivedMessageSize = 2147483647; //设置最大的接受消息缓存字节 //设置超时时间(设置超时是我自己加的)             basicBinding.CloseTimeout = new TimeSpan(0,10,0);
            basicBinding.OpenTimeout = new TimeSpan(0,0);
            basicBinding.ReceiveTimeout = new TimeSpan(0,0);
            basicBinding.SendTimeout = new TimeSpan(0,0);
CustomBinding binding = CustomBinding(basicBinding);   BindingElement binaryElement = BinaryMessageEnCodingBindingElement();   EndpointAddress endPoint = EndpointAddress(serviceAddress); //根据读取的外部XML指定的Webservice地址来实例化终结点地址。   WebServiceSoapClIEnt _LBControl = WebServiceSoapClIEnt(); //实例化WebService代理类 _LBControl = (WebServiceSoapClIEnt)Activator.CreateInstance( typeof (WebServiceSoapClIEnt),binding,endPoint); //使用反射来实例化我们需要指定的webService地址 return _LBControl ;

        }


      当然以上只是关键性代码,我们在实践中还需要自己写一个WebService做测试,在本实例源代码程序中,我们在SLreadxml.Web项目中新建了一个WebService.asmx页面,此页面写了一个简单的WebService方法:

[WebMethod]         public  string  HelloWorld()         {             return  "Hello World For TestData" ; }

然后我们右键点击SLreadxml项目名然后选择“添加服务引用”,在d出的窗口中,我填入SLreadxml.Web中WebService.asmx页面的http地址。(注意这里的http以你自己的WebService地址为准,你可以重新架设一个网站目录或者IP上。)http://localhost:1239/webService.asmx,然后点击“前进”,在这里创建好这个服务引用的代理类。并且命名此命名空间名为LBControl,然后我们需要在App.xaml.cs文件中引入以下命名空间:

using  System.IO;System.Xml; System.windows.browser;System.ServiceModel; System.ServiceModel.Channels;SLreadxml.LBControl;

当然System.ServiceModel域名空间还需要单独引用其DLL文件。在SLreadxml右键--“添加引用”。

另外想要WebService能够被访问到,还需要添加clIEntaccesspolicy.xml文件,此文件叙述了你可以安全的引用某一个网站下的WebService.类似于安全许可吧。值得注意的是这个文件必须放在你的网站的根目录下面,那么你的这个WebService文件才能够被访问到。不是虚拟目录的根目录,而是你网站的根目录。切记。

clIEntaccesspolicy.xml源代码:

<?xml version="1.0"  enCoding="utf-8"  ?><access-policy>   <cross-domain-access>    <policy>       <allow-from  http-request-headers="*">        <domain uri=/> </allow-from><grant-to> <resource path="/"  include-subpaths="true"/></grant-to> </policy></cross-domain-access> </access-policy>


     好了。现在基本上已经可以实现动态的访问XML来动态的读取WebService地址。而不用每次都要去XAP包里面修改WebService地址了。那样太麻烦了。

最后给出Config.xml的源代码:

1 2 3 4 <configuration> <TestData>http: //localhost:1239/webService.asmx</TestData> <Secdata>Secend Test Data</Secdata> </configuration>

      本实例的源代码如下,点击请下载:SLReadXMLForWebService.rar 。



2. 下面加上牛人的评论 #5楼   2011-02-11 11:49  Nisten    其实不想手工更改webservice url,只要利用GetUrl()获得webservice url,赋值给WebServiceSoapClIEnt(Configurationname,WebServiceAddress),就可以实现楼主想要的.

经过重构的代码:

public voID InitializeServices(string serviceAddress)
{
WebServiceSoapClIEnt _LBControl = new WebServiceSoapClIEnt("WebServiceSoap",serviceAddress);
_LBControl.HelloWorldAsync();
_LBControl.HelloWorldCompleted += new EventHandler<HelloWorldCompletedEventArgs>(_LBControl_HelloWorldCompleted);
} @H_185_403@ #6楼 [ @H_183_404@楼主]  2011-02-11 13:12  程兴亮  @Nisten
兄弟重构过的代码确实更为简单,明了。在这里感谢兄弟。将兄弟的这段代码覆盖我原来程序中的代码能够提高很好的效率。^^
GetUrl()函数(这个函数在我源代码程序中)只能获取到本地的Url,而如果当我们将本地项目移交到现场的时候,很可能现场的WebService的IP地址和Silverlight的XAP包文件地址不一致。在这个时候GetUrl()函数获取到的WebService Url显然不能满足这种需求,所以还是最好在XML中能够手动配置WebService Url为好。方便现场的测试人员自由的修改WebService地址。

附上原文地址:
http://www.cnblogs.com/chengxingliang/archive/2011/02/10/1950759.html

PS. 如果有更好的方法欢迎评论留言

也可以联系我点击这里


      当然以上只是关键性代码,我们在实践中还需要自己写一个WebService做测试,在本实例源代码程序中,我们在SLreadxml.Web项目中新建了一个WebService.asmx页面,此页面写了一个简单的WebService方法:

[WebMethod]       public  string  HelloWorld()       {           return  "Hello World For TestData"; }

然后我们右键点击SLreadxml项目名然后选择“添加服务引用”,在d出的窗口中,我填入SLreadxml.Web中WebService.asmx页面的http地址。(注意这里的http以你自己的WebService地址为准,你可以重新架设一个网站目录或者IP上。)http://localhost:1239/webService.asmx,然后点击“前进”,在这里创建好这个服务引用的代理类。并且命名此命名空间名为LBControl,然后我们需要在App.xaml.cs文件中引入以下命名空间:

using  System.IO;System.Xml; System.windows.browser;System.ServiceModel; System.ServiceModel.Channels;SLreadxml.LBControl;

当然System.ServiceModel域名空间还需要单独引用其DLL文件。在SLreadxml右键--“添加引用”。

另外想要WebService能够被访问到,还需要添加clIEntaccesspolicy.xml文件,此文件叙述了你可以安全的引用某一个网站下的WebService.类似于安全许可吧。值得注意的是这个文件必须放在你的网站的根目录下面,那么你的这个WebService文件才能够被访问到。不是虚拟目录的根目录,而是你网站的根目录。切记。

clIEntaccesspolicy.xml源代码:

<?xml version="1.0"  enCoding="utf-8"  ?><access-policy>   <cross-domain-access>    <policy>       <allow-from  http-request-headers="*">        <domain uri=/> </allow-from><grant-to> <resource path="/"  include-subpaths="true"/></grant-to> </policy></cross-domain-access> </access-policy>


     好了。现在基本上已经可以实现动态的访问XML来动态的读取WebService地址。而不用每次都要去XAP包里面修改WebService地址了。那样太麻烦了。

最后给出Config.xml的源代码:

1 2 3 4
<configuration> <TestData>http: //localhost:1239/webService.asmx</TestData> <Secdata>Secend Test Data</Secdata> </configuration>

      本实例的源代码如下,点击请下载:SLReadXMLForWebService.rar 。

总结

以上是内存溢出为你收集整理的Silverlight调用WebService 之 Silverlight动态加载外部XML指定地址的WebService---(动态加载外部XML文件中指定的WebService地址)全部内容,希望文章能够帮你解决Silverlight调用WebService 之 Silverlight动态加载外部XML指定地址的WebService---(动态加载外部XML文件中指定的WebService地址)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1011687.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存