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

來源:互聯網
上載者:User
作者: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請求的Mashup。asbx檔案其實是一個結構化的XML文檔,裡麵包含了對遠端Web Service方法的封裝,當然,您也可以同時指定一個CodeBehind CS檔案用來對其進行一些複雜的控制。asbx檔案和aspx檔案位於同一台主機上。Atlas網站在編譯的時候會根據asbx中的聲明以及相應的CodeBehind檔案(如果存在)將其編譯並註冊。這樣當用戶端JavaScript調用該asbx中定義的方法時,asbx會將其轉寄給實際的Web Service並將返回結果會送給用戶端,起到一個Bridge的作用。而對於用戶端,就和直接調用 同一主機上的Web Service沒什麼不一樣。

如果您安裝過Atlas的msi檔案,並建立了一個Atlas Web Site,那麼下面的配置已經為您做好了。否則,啟用asbx的支援,您需要如下的操作:

  1. 在IIS的虛擬目錄下按照所示,添加.asbx檔案的映射。
  2. 在web.config的sectionGroup段添加:

<section name="webServices" type="Microsoft.Web.Configuration.WebServicesSection" />
  1. 在web.config的compilation段添加:

<buildProviders>
   <add extension=".asbx" type="Microsoft.Web.Services.BridgeBuildProvider"/>
</buildProviders>

  1. 在web.config的httphandlers段添加:
<add verb="*" path="*.asbx" type="Microsoft.Web.Services.ScriptHandlerFactory" validate="false"/>
  1. 在web.config的httpmodules段添加:
<add name="BridgeModule" type="Microsoft.Web.Services.BridgeModule"/>

下面讓我們通過一個最簡單的樣本學習Atlas中Mashup的基本概念和asbx檔案的基本結構。

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

using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;

[WebService(Namespace = "http://www.dflying.net/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class SimpleWebService : System.Web.Services.WebService
{
    [WebMethod]
    public int Add(int value1, int value2)
    {
        return value1 + value2;
    }
}

我將這個Web Service置於另外一台主機的IIS上,注意:我們應該更改web.config檔案以允許通過HTTP GET對Web Service的訪問,而不僅僅是預設的POST:

<webServices>
  <protocols>
    <add name="HttpGet"/>
  </protocols >
</webServices>

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

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

<?xml version="1.0" encoding="utf-8" ?>
<bridge namespace="Test" className="SimpleWebService">

  <proxy type="Microsoft.Web.Services.BridgeRestProxy" 
         serviceUrl="http://dflyingchen/MyServices/SimpleWebService.asmx/Add" />

  <method name="Add">
    <input>
      <parameter name="value1" />
      <parameter name="value2" />
    </input>
  </method>
</bridge>

注意到作為一個合法的XML檔案,asbx檔案第一行是XML的聲明。然後,對於本asbx檔案,有如下部分:

  1. bridge段,聲明該mashup的namespaceclass name。注意這兩個屬性代表的是用戶端調用時所見的被mashup過的namespace和class name,並不是遠端Web Service的namespace和class name。
  2. proxy段,聲明該mashup的類型,這裡我們指定為Microsoft.Web.Services.BridgeRestProxy相應的,指定一個代表格服務URL的string:http://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:

<atlas:ScriptManager ID="sm" runat="server">
    <Services>
        <atlas:ServiceReference Path="SimpleBridge.asbx" />
    </Services>
</atlas:ScriptManager>

然後添加一段HTML,用來提供使用者輸入,引發調用並顯示結果;

<input id="input1" type="text" value="1" size="3" />
<input id="input2" type="text" value="2" size="3" />
<input id="doAdd" type="button" value="Add" onclick="return doAdd_onclick()" />
<div id="result" />

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

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

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

瀏覽器中如下:

樣本程式原始碼可以在此下載:http://files.cnblogs.com/dflying/SimpleBridgeDemo.rar

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.