国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

利用微軟Atlas消費外部Web服務

2019-11-17 04:43:39
字體:
來源:轉載
供稿:網友
摘要 為了從Atlas中消費外部Web服務,你可以為這些服務構建一個基于服務器的Web服務代理。幸好,你可以利用Visual Studio和Atlas特征來處理這其中的大部分工作。
 
  一、引言

  如今,Ajax已經成為構建基于瀏覽器的交互式客戶端應用程序的主流技術,從而使得服務器端行為集中于提供特定的Web服務。另一方面,Web服務已經成為當今在服務器級暴露業務功能的事實上的標準。假定如此,那么出現一個核心開發問題:如何使你的基于AJAX的應用程序與Web服務進行通訊?本文正是想同你一起探討如何使用微軟Atlas(最近,又命名為asp.net AJAX)來實現這一目的。

  首先,你需要使用Visual Studio 2005,并且需要下載和安裝微軟Atlas。假如你沒有安裝Visual Studio 2005,那么你可以下載一個免費的Visual Studio EXPRess版本。本文將使用一個ZipCodeRUs示例應用程序來解釋如何通過Atlas實現該程序與Web服務的交互。這個示例應用程序能夠檢索具體的郵政代碼信息,例如城市、縣的名稱及其緯度、經度等信息。該程序依靠于tilisoft.com網站提供的一個免費且公開可用的Web服務來檢索該信息。這個示例應用程序從下面兩個角度展示了Atlas的Web服務威力:

  · 展示了Atlas的javascript代理,這個代理能夠與一個ASP.NET(.asmx)Web服務(該服務擔當到外部Tilisoft ZIP代碼Web服務的"溝通"橋梁)進行異步地通訊。

  · 還展示Atlas從Javascript客戶端成批地調用服務器端web服務的能力。

  【作者注】 微軟Atlas還支持創建到外部Web服務的基于xml的聲明性橋接而不必創建上面的所謂"溝通"服務;不過,本文并沒有涉及有關這個橋接特征的討論。

  二、Atlas Web服務入門

  打開Visual Studio,通過選擇如圖1所示的"Atlas"Web Site
利用微軟Atlas消費外部Web服務(圖一)
圖1.創建一個新的Atlas Web應用程序:當你安裝微軟Atlas CTP后,你會在"New Web Site"對話框中看到一個新的稱為"Atlas"Web Site的工程模板。

  與依靠于外部Web服務(服務不是在與應用程序本身相同的域內提供)的AJAX應用程序相關的一個常見的問題是,你不能夠使用JavaScript來直接存取這樣的Web服務-瀏覽器將阻止所有這樣的"cross-scripting"存取。由于安全原因,瀏覽器僅僅答應一個Web頁面中的JavaScript存取最初創建該頁面的網站。為了解決這個問題,Atlas JavaScript客戶端依靠于.asmx文件(ASP.NET Web服務)來創建運行時刻JavaScript代理。換句話說,客戶端先調用一個由home(本地)域所暴露的Web服務,然后由這個服務再調用外部Web服務,最后簡單地把響應傳送回客戶端。

  因此,在你能夠從你的Atlas客戶端調用一個外部Web服務前,你首先需要創建一個強類型化代理。在這個示例中,我為Zip代碼Web服務構建了一個C#代理,其中還創建了一個ASP.NET Web服務,它用作一個上面的"溝通橋梁"。

  三、 創建一個代理客戶類

  存在兩種創建Web服務客戶端代理類的方法。你可以在Visual Studio命令行上使用wsdl.exe來創建這些代理類;或者從Visual Studio IDE中創建一個Web引用。下面命令展示了如何從你的應用程序的App_Code文件夾下使用wsdl.exe來為ZipCode Web服務創建強類型化代理類。注重,當你從命令行輸入下列代碼時,下面這些內容應該在同一行上。

C:/projects/ZipCodeRUS/App_code> wsdl.exe
http://www.tilisoft.com/ws/LocInfo/ZipCode.asmx?WSDL
/namespace:Tilisoft.ZipCode

  上面的命令將創建一個ZipCode.cs文件,它包含一個你能夠在你的本地的代碼中使用的TiliSoft.ZipCode代理類。

  接下來,你需要創建上面起"溝通橋梁"作用的Web服務。右擊Solution Explorer中的最上面一層,并從彈出菜單中選擇"Add New Item…"選項,然后選擇Web服務模板。我把該服務命名為"ZipCodeConduitService"。

  這個ZipCodeConduitService服務中只提供了一個稱為GetZipCodeInfo的函數。它使用兩個字符串參數:一個字符串correlationID,一個ZIP代碼。當被調用時,該服務使用生成的代理類以便TiliSoft Web服務檢索特定數據,最后,把這些結果傳遞回ZipCodeConduitData應用程序。為了演示Atlas的異常處理能力,我添加了一個"小拐彎":假如用戶輸入的ZIP代碼是"錯誤",那么GetZipCodeInfo()將拋出一個ZipCodeConduitException異常。下面是相應于ZipCodeConduitService Web服務類的代碼:

...
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class ZipCodeConduitService : System.Web.Services.WebService{
 ...
 [WebMethod]
 public ZipCodeConduitData GetZipCodeInfo(String corelationId,String zipCode) {
  if (zipCode.Equals("error")){
   throw new ZipCodeConduitException(corelationId,"Here is an error just for you!! Enjoy!");
  }
  ZipCode xZipCodeService = new ZipCode();
  ZipCodeConduitData zipCodeConduitData = null;
  ZipCodeData xZipCodeData = xZipCodeService.GetInfo(zipCode);
  zipCodeConduitData = new ZipCodeConduitData(corelationId, zipCode, xZipCodeData);
  return zipCodeConduitData;
 }
}
  在前面的代碼中,ZipCodeConduitData是一個值對象,用于在客戶端和ZipCodeConduitService之間傳遞信息。這個ZipCodeConduitData類具有如下所示的get屬性,而CorelationId屬性答應客戶端跟蹤它們的請求。

...
using Tilisoft.ZipCode;
public class ZipCodeConduitData{
 public ZipCodeConduitData(String corelationId,ZipCodeData data) {
  hydrate(corelationId, data);
 }
 String _corelationId;
 public String CorelationId{
  get { return _corelationId; }
 }
 ...
 String _county;
 public String County{
  get { return _county; }
 }
 String _city;
 public String City{
  get { return _city; }
 }
 ...
 private void hydrate(String corelationId, ZipCodeData data) {
  _corelationId = corelationId;
  if (data.ZipCodeInfo.Count > 0) {
   _zipCode = data.ZipCodeInfo[0].ZIPCODE;
   _county = data.ZipCodeInfo[0].COUNTY;
   _city = data.ZipCodeInfo[0].CITY;
   ...
  }
 }
}
  這個ZipCodeConduitException是一個派生自System.Exception的C#異常類。該異常類包括correlationId值;客戶端在每次發送請求時都使用它,詳見下面的代碼片斷:

...
using System;
...
public class ZipCodeConduitException : System.Exception{
 String _corelationId;
 public String CorelationId{
  get { return _corelationId; }
  set { _corelationId = value; }
 }
 public ZipCodeConduitException(String corelationId, String message):base(message) {
  _corelationId = corelationId;
 }
}
QQRead.com 推出數據恢復指南教程 數據恢復指南教程 數據恢復故障解析 常用數據恢復方案 硬盤數據恢復教程 數據保護方法 數據恢復軟件 專業數據恢復服務指南
  四、 構建ZipCode JavaScript客戶端

  現在,既然你已經實現了服務器端的Web服務代碼,那么接下來,你可以創建一個存取該服務的JavaScript客戶端。為此,你要添加ZipCodeConduitClient.aspx;這是通過使用"Add New Item…"→"Web Form"選項來把一個Web表單添加到你的ZipCodeRUs中實現的。

  在ZipCodeConduitClient.aspx代碼中,通過創建Atlas的ScriptManager的一個實例并且把一個對基于ASP.NET的Web服務ZipCodeConduitService.asmx文件的引用添加到Web頁面的元素來啟動微軟Atlas。詳見下面的代碼:...
<head id="Head1" runat="server">
<title>Zip Code Information Service - Atlas JavaScript Conduit
Client</title>
<atlas:ScriptManager ID="scriptManager" runat="server"
EnableScriptComponents="true">
<Services>
<atlas:ServiceReference
Path="ZipCodeConduitService.asmx" />
</Services>
</atlas:ScriptManager>
<script type="text/xml-script">
<page xmlns:script=
"http://schemas.microsoft.com/xml-script/2005">
<components>
<webRequestManager batchSize="5"
enableBatching="true" batchDelay="3000" />
</components>
</page>
</script>
</head>
...
  有趣的是,前面的代碼支持在JavaScript和Web服務之間的"批"方式的Web服務請求。通過添加webRequestManager元素以及把enableBatching屬性值設置為true可以使得由Atlas來承擔所有的繁重工作-積累所有的請求,然后在一個批中立即執行它們。Atlas還能夠跟蹤所有的返回值和來自于Web服務中的對象。注重,上面的代碼能夠"積累"達到五個請求,然后一次性執行所有的請求。

  現在,你可以通過添加一些Html和ASP元素來創建web頁面上的可視化元素。最終產生的頁面大致如圖2所示。

利用微軟Atlas消費外部Web服務(圖二)
圖2.該圖展示了Visual Studio中處于設計方式的ZipCodeConduitClient.aspx頁面。

...
<form id="ZipCodeConduitClient" runat="server" ></form>
<h4>
Enter ZipCodes: 1> <input id="textZipCode1" />
2> <input id="textZipCode2" />
3> <input id="textZipCode3" />
<input id="buttonZipCode" type="button"
value="Get Information"
onclick="return OnbuttonZipCode_click()" />
</h4>

<table border="1" cellpadding="5" cellspacing="2">
<tr>
<td></td>
<td><asp:Label ID="corelationId1" runat="server"
Text="."/></td>
<td><asp:Label ID="corelationId2" runat="server"
Text="."/></td>
<td><asp:Label ID="corelationId3" runat="server"
Text="."/></td>
</tr>
<tr>
<td>ZipCode</td>
<td><asp:Label ID="zipCode1" runat="server"
Text="."/></td>
<td><asp:Label ID="zipCode2" runat="server"
Text="."/></td>
<td><asp:Label ID="zipCode3" runat="server"
Text="."/></td>
</tr>
...
<tr>
<td></td>
<td><asp:Label id="message1" runat="server"
Text="."/></td>
<td><asp:Label id="message2" runat="server"
Text="."/></td>
<td><asp:Label id="message3" runat="server" Text="."/></td>
</tr>
</table>

<asp:Label ID="message" runat="server" BorderStyle="Groove"
BackColor="#FF8080" BorderWidth="1px" Font-Bold="True"
ForeColor="White">Ready</asp:Label>
...
  注重,在此,"Get Information"(在源代碼中命名為buttonZipCode)按鈕的點擊導致調用OnbuttonZipCode_click() JavaScript函數,請參考下面的代碼:

<script type="text/javascript" language="JavaScript">
function OnbuttonZipCode_click()
{
 document.getElementById('message').innerHTML = "Retrieving Information...";
 if (document.getElementById('textZipCode1').value.length > 0)
 {
  service = ZipCodeConduitService.GetZipCodeInfo("1", document.getElementById('textZipCode1').value,
   OnComplete, //完成事件
   OnTimeout, //超時事件
   OnError // 出錯事件
  );
 }
 ...
}
return false;
}
...
</script>
  在這個OnbuttonZipCode_click函數中,ZipCodeConduitService JavaScript代理對象可以為Atlas所隱含地使用。注重,GetZipCodeInfo()函數共使用三個參數,除了在ZipCodeConduitService Web服務中GetZipCodeInfo()函數所使用的兩個參數以外。這是因為Atlas使所有的Web服務調用都以異步地進行;在發出一個Web服務調用后,JavaScript客戶端代碼并不等待該服務器的響應。當響應到達時,Atlas框架需要使用客戶端的一個回調函數。GetZipCodeInfo方法使用的其它參數正是從JavaScript代碼指向這些回調函數的指針。來自于服務器的響應可能是成功的,可能是返回一個錯誤消息,也可能是因超時而無響應返回。前面的代碼分別由OnComplete(),OnError()和OnTimeout()函數負責處理每一種可能的響應類型。 QQRead.com 推出數據恢復指南教程 數據恢復指南教程 數據恢復故障解析 常用數據恢復方案 硬盤數據恢復教程 數據保護方法 數據恢復軟件 專業數據恢復服務指南
  下面代碼列出了這些函數。這些函數都接收一個result參數,其中包含服務器返回的響應。在此情況下,ZipCodeConduitService把一個ZipCodeConduitData類的實例返回給OnComplete()函數,而把一個ZipCodeConduitException異常返回給OnError()函數。

...
function OnComplete(result) {
 document.getElementById('message').innerHTML = "Ready";
 if (result.CorelationId == '1') {
  document.getElementById('corelationId1').innerHTML = result.CorelationId;
  ...
  document.getElementById('message1').innerHTML =
  result.Message;
 }
 else if (result.CorelationId == '2') {
  ...
 }
 else if (result.CorelationId == '3') {
  ...
 }
}
function OnError(result) {
 displayMessage(result);
}
function OnTimeout(result) {
 document.getElementById('message').innerHTML = "Request Timeout";
}
function displayMessage(result) {
 if (result.CorelationId == '1') {
  document.getElementById('message1').innerHTML = result.get_message();
 }
 ...
}
</script>
  五、運行結果

  至此,服務器端與客戶端代碼都已到位。在Visual Studio中以debug方式啟動ZipCodeConduitClient.aspx或把你的應用程序發布到一個網站;然后,試著輸入三個ZIP代碼來檢索關于這三個ZIP代碼的細節,請參考下面圖3。

利用微軟Atlas消費外部Web服務(圖三)
圖3.ZipCodeConduitClient運行中:這是在一個Web瀏覽器中運行ZipCodeConduitClient.aspx頁面并顯示檢索三個ZIP代碼的結果。

  六、小結

  如今,AJAX使得開發交互性的Web應用程序進一步簡單化;而現在微軟也已經著手簡化從支持AJAX技術的客戶端應用程序中調用Web服務的過程。隨著AJAX技術進一步融入主流開發中,我們完全可以期望微軟把Atlas更為緊密地集成到Visual Studio中及其它微軟開發平臺和產品中。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 瓦房店市| 彰化县| 内江市| 增城市| 河北区| 滨海县| 开原市| 塘沽区| 当阳市| 拉萨市| 永修县| 北票市| 深圳市| 佛教| 邢台市| 泰宁县| 上犹县| 公安县| 佛坪县| 宣汉县| 五常市| 洛浦县| 临颍县| 济南市| 哈密市| 新巴尔虎右旗| 金沙县| 龙江县| 邵阳市| 呼和浩特市| 马边| 镇坪县| 错那县| 浠水县| 都昌县| 宁夏| 秦皇岛市| 漠河县| 漠河县| 齐齐哈尔市| 阆中市|