接上節所講的,Silverlight可以加載外部的XML檔案裡面的内容,那麼我們可不可以在外部XML裡面配置一個WebService位址,并且以 此加載這個位址來動态加載WebService呢?這樣子就可以避免當WebService位址改變的時候,還要打開XAP包來重新修改 WebService配置的位址了。
答案當然是可以的。在這裡,我制作了一個執行個體。
在前面一節裡面,我們講到了使用WebClient來下載下傳Silverlight程式外部的XML檔案内容。在本節中,我們重點需要講解一下如何使用反射來動态生成WebService代理類。關鍵代碼如下:
public void InitializeServices(string serviceAddress)
{
BasicHttpBinding basicBinding = new BasicHttpBinding();//建立BasicHttpBinding綁定類
basicBinding.MaxBufferSize = 2147483647;//設定最大緩存位元組
basicBinding.MaxReceivedMessageSize = 2147483647;//設定最大的接受消息緩存位元組
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位址
當然以上隻是關鍵性代碼,我們在實踐中還需要自己寫一個WebService做測試,在本執行個體源代碼程式中,我們在SLReadXML.Web項目中建立了一個WebService.asmx頁面,此頁面寫了一個簡單的WebService方法:
[WebMethod]
public string HelloWorld()
{
return "Hello World For TestData";
}
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>
本文轉自程興亮 51CTO部落格,原文連結:http://blog.51cto.com/chengxingliang/821211