天天看點

2.Silverlight動态加載外部XML指定位址的WebService-(動态加載外部XML檔案中指定的WebService位址)

接上節所講的,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

繼續閱讀