Silverlight调用WebService 之 Silverlight动态加载外部XML指定地址的WebService---(动态加载外部XML文件中指定的WebService地址)
来源:互联网 发布:佳美迅授课软件 编辑:程序博客网 时间:2024/05/17 01:37
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();
//创建BasicHttpBinding绑定类
basicBinding.MaxBufferSize = 2147483647;
//设置最大缓存字节
basicBinding.MaxReceivedMessageSize = 2147483647;
//设置最大的接受消息缓存字节
//设置超时时间(设置超时是我自己加的)
basicBinding.CloseTimeout = new TimeSpan(0, 10, 0);
basicBinding.OpenTimeout = new TimeSpan(0, 10, 0);
basicBinding.ReceiveTimeout = new TimeSpan(0, 10, 0);
basicBinding.SendTimeout = new TimeSpan(0, 10, 0);
CustomBinding binding =
new
CustomBinding(basicBinding);
BindingElement binaryElement =
new
BinaryMessageEncodingBindingElement();
EndpointAddress endPoint =
new
EndpointAddress(serviceAddress);
//根据读取的外部XML指定的Webservice地址来实例化终结点地址。
WebServiceSoapClient _LBControl =
new
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项目名然后选择“添加服务引用”,在弹出的窗口中,我填入SLReadXML.Web中WebService.asmx页面的http地址。(注意这里的Http以你自己的WebService地址为准,你可以重新架设一个网站目录或者IP上。)http://localhost:1239/webService.asmx,然后点击“前进”,在这里创建好这个服务引用的代理类。并且命名此命名空间名为LBControl,然后我们需要在App.xaml.cs文件中引入以下命名空间:
using
System.IO;
using
System.Xml;
using
System.Windows.Browser;
using
System.ServiceModel;
using
System.ServiceModel.Channels;
using
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的源代码:
<configuration>
<TestData>http:
//localhost:1239/webService.asmx</TestData>
<SecData>Secend Test Data</SecData>
</configuration>
本实例的源代码如下,点击请下载:SLReadXMLForWebService.rar 。
兄弟重构过的代码确实更为简单,明了。在这里感谢兄弟。将兄弟的这段代码覆盖我原来程序中的代码能够提高很好的效率。^^
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项目名然后选择“添加服务引用”,在弹出的窗口中,我填入SLReadXML.Web中WebService.asmx页面的http地址。(注意这里的Http以你自己的WebService地址为准,你可以重新架设一个网站目录或者IP上。)http://localhost:1239/webService.asmx,然后点击“前进”,在这里创建好这个服务引用的代理类。并且命名此命名空间名为LBControl,然后我们需要在App.xaml.cs文件中引入以下命名空间:
using
System.IO;
using
System.Xml;
using
System.Windows.Browser;
using
System.ServiceModel;
using
System.ServiceModel.Channels;
using
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的源代码:
<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 动态访问Webservice
- Silverlight 动态调用 WCF And WebService
- Silverlight动态调用WEBSERVICE,WCF方法
- Silverlight实用窍门序列:1.Silverlight读取外部XML加载配置---(使用WebClient读取XAP包同目录下的XML文件))【附带实例源码】
- webservice实际应用之调用外部系统提供的服务端地址,写java的webservice客户端程序并通过接口给外部系统传数据
- 动态设置 WebService (.asmx) 的 IP 地址
- ArcGis For Silverlight API,地图显示Gis,绘制点,线,绘制图等(二)--Silverlight 配置动态的 webService、动态加载ArcGis地图服务
- ArcGis For Silverlight API,地图显示Gis,绘制点,线,绘制图等(二)--Silverlight 配置动态的 webService、动态加载ArcGis地图服务
- 动态加载WebService DEMO
- 不错的webservice调用地址
- Silverlight 2beta2 调用 SharePoint的WebService......
- Silverlight调用WebService
- Silverlight调用webservice
- java调用外部webservice的实例
- java调用外部webservice接口的方法
- 转:动态修改webservice地址
- zoj 3820(2014牡丹江现场赛B题)
- STM32的IO口的8种配置
- zoj How Many Shortest Path
- 栈的学习
- 深入理解SetUID
- Silverlight调用WebService 之 Silverlight动态加载外部XML指定地址的WebService---(动态加载外部XML文件中指定的WebService地址)
- mth服务器dxi_change_log僵死问题
- linux UID,GID,EUID,EGID,SUID,SGID快速理解
- TCP/IP三次握手和HTTP过程
- hdu 5029 Relief grain(树链剖分+线段树)
- 关于C/C++头文件重复定义的思考
- Canny边缘检测算法原理及其VC实现详解(一)
- vijos P1775 乌龟棋
- 【漂浮法或线段树】 解决矩阵覆盖(计算几何)问题
经过重构的代码:
public void InitializeServices(string serviceAddress)
{
WebServiceSoapClient _LBControl = new WebServiceSoapClient("WebServiceSoap", serviceAddress);
_LBControl.HelloWorldAsync();
_LBControl.HelloWorldCompleted += new EventHandler<HelloWorldCompletedEventArgs>(_LBControl_HelloWorldCompleted);
}