天天看點

深入Atlas系列:Web Sevices Access in Atlas示例(4) - 使用HTTP GET調用Web Services方法

  在之前的例子裡,由于Atlas用戶端在調用Web Services方法時總是使用了Sys.Net.ServiceMethod類,是以始終使用了HTTP POST方法與伺服器端進行互動。POST方法有其好處,不過GET方法也自有其價值。我們在使用Atlas進行Web Services調用時,我們必須保證我們請求的Web Services資源在同一個Domain下面。這一點無論在使用XMLHttpRequest對象還是IFrame時都有這樣的限制,當然這是為了安全性考慮(即使如此,Ajax還是帶來了太多的security issues)。不過GET方法可以在某些情況下繞過這一點,例如在一個IFrame或新視窗中打開等等。雖然依然無法和不同Domain下Web services通信,但是如果隻是為了“通知”的作用,已經足夠了。

在Atlas中,它的“Web Services”被放在了一個特殊的運作環境中執行(在某些情況下會委托給ASP.NET原有元件執行,這點在之前的文章中有過分析),是以,即使我們不是通過AJAX方式通路,隻要了解Atlas那一套特殊的運作環境的行為,依舊能夠給我們帶來一些别的使用方式。下面的示例就将使用Atlas伺服器端對于Web Services調用的支援,來講解如何使用HTTP GET來調用Web Services方法(除非特别說明,以下所有的解釋均針對Atlas的擴充,而不是ASP.NET的原有Web Services支援)。

首先,我們寫一個Web Serivces方法:

深入Atlas系列:Web Sevices Access in Atlas示例(4) - 使用HTTP GET調用Web Services方法
深入Atlas系列:Web Sevices Access in Atlas示例(4) - 使用HTTP GET調用Web Services方法

Vote方法代碼

 1 [WebMethod]

 2 [WebOperation(true, ResponseFormatMode.Xml)]

 3 public XmlDocument Vote(string name, int id)

 4 {

 5     XmlDocument responseDoc = new XmlDocument();

 6     responseDoc.LoadXml(

 7         "<?xml-stylesheet type=\"text/xsl\" href=\"Vote.xsl\"?>" +

 8         "<response><user></user><id></id></response>");

 9     responseDoc.SelectSingleNode("//user").InnerText = name;

10     responseDoc.SelectSingleNode("//id").InnerText = id.ToString();

11     return responseDoc;

12 }

在Atlas中,HTTP POST為Web Services的預設支援方法,也是必然的支援方法。而如果需要使該Web Service方法支援HTTP GET的話,就必須如上面代碼一樣,使用Microsoft.Web.Services.WebOperationAttribute進行标注。WebOperationAttribute的第一個參數就是getVerbEnabled,true則表示支援HTTP GET方法。第二個參數Microsoft.Web.Services.ResponseFormatMode.Xml則表示結果對象的輸出方式為XML,而不是預設的JSON。

在這裡,我們使用XML的原因是因為JSON在這裡沒有任何意義。傳回JSON後是為了在獲得這些内容之後通過Javascript函數eval執行,進而獲得JSON表示的對象。而在這裡,我們的目的是将結果顯示給使用者看,是以使用XML形式傳回,再加上XSL的支援,就能以HTML的形式顯示給使用者了。

然後就是簡單的XSL:

深入Atlas系列:Web Sevices Access in Atlas示例(4) - 使用HTTP GET調用Web Services方法
深入Atlas系列:Web Sevices Access in Atlas示例(4) - 使用HTTP GET調用Web Services方法

Vote.xsl檔案内容

 1 <?xml version="1.0" encoding="utf-8"?>

 2 <xsl:stylesheet version="1.0"

 3     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 4     <xsl:template match="/response">

 5         <html>

 6             <head>

 7                 <title>Thanks for your participation.</title>

 8             </head>

 9             <body style="font-family:Verdana; font-size:13px;">

10                 <h4>Thanks for your participation.</h4>

11                 <div>

12                     <xsl:text>Dear </xsl:text>

13                     <xsl:value-of select="user"/>

14                     <xsl:text>, you've voted for item </xsl:text>

15                     <xsl:value-of select="id"/>

16                     <xsl:text>.</xsl:text>

17                 </div>

18             </body>

19         </html>

20     </xsl:template>

21 </xsl:stylesheet> 

接下來就是我們的HTML檔案。我們的目的非常簡單,就是得到使用者輸入的資訊,拼接成URL之後在新視窗中打開。是以我們在這裡根本無需使用Atlas。代碼如下:

深入Atlas系列:Web Sevices Access in Atlas示例(4) - 使用HTTP GET調用Web Services方法
深入Atlas系列:Web Sevices Access in Atlas示例(4) - 使用HTTP GET調用Web Services方法

HTML代碼

 1 <div>Name:<input type="text" id="txtName" /></div>

 2 <div>Item:

 3 <select id="comboItem">

 4     <option value="1">Item 1</option>

 5     <option value="2">Item 2</option>

 6     <option value="3">Item 3</option>

 7     <option value="4">Item 4</option>

 8     <option value="5">Item 5</option>

 9 </select>

10 </div>

11 <input type="button" value="Vote" onclick="vote()" />

點選“Vote”按鈕後,就會調用Javascript函數Vote()。代碼如下:

深入Atlas系列:Web Sevices Access in Atlas示例(4) - 使用HTTP GET調用Web Services方法
深入Atlas系列:Web Sevices Access in Atlas示例(4) - 使用HTTP GET調用Web Services方法

Javascript代碼

 1 <script language="javascript">

 2     function vote()

 3     {

 4         var url = "HttpGetWebService.asmx?mn=Vote";

 5         url += ("&name=" + encodeURI(document.getElementById("txtName").value));

 6         url += ("&id=" + document.getElementById("comboItem").value);

 7 

 8         window.open(url);

 9     }

10 </script>

我們需要拼接的URL很簡單:首先使用在QueryString裡将mn設為我們即将調用的Web Services方法名,然後就是在QueryString裡附加Web Services方法所需的參數了。請注意,既然是使用URL拼接,那麼就必須使用encodeURI進行編碼後才能使用,否則可能會出現異常情況。

我們現在來看一下使用情況。首先打開HTML頁面:

深入Atlas系列:Web Sevices Access in Atlas示例(4) - 使用HTTP GET調用Web Services方法

輸入姓名,選擇下拉框中的其中一項,然後點選“Vote”按鈕,則可以在彈出視窗中看到結果:

深入Atlas系列:Web Sevices Access in Atlas示例(4) - 使用HTTP GET調用Web Services方法

這就是使用了HTTP GET方法調用Web Services方法的示例,使用它可以跨域名地傳遞資料,雖然依舊不能進行互動。

請注意它使用了Atlas的Web Services運作環境,離開了它就不能這麼做了。另外,由于使用了QueryString來傳遞資料類型,是以如此簡單地應用這個方法的話,就隻能在Web Services方法中使用基本類型地參數了,否則伺服器端将會抛出異常。不過,Atlas也想到了這一點,在下一篇文章裡,我将提供示例來解釋一下如何告訴Atlas,在必要時刻将一個基礎類型轉化成複雜類型。

點選這裡下載下傳示例源檔案。