熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

ASP.NET創建Web服務之設計方針

2013-11-13 09:53:33  來源: .NET編程 

  使用ASPNET構造一個簡單的XML Web服務是相對容易的然而XML Web服務的真正的強大的功能只有等你研究了基礎結構以後才能領悟XML Web服務是建立在NET框架和公共語言運行時間基礎上的一個XML Web服務可以利用這些技術例如ASPNET支持的性能狀態管理和驗證全都可被用來構造XML Web服務

  XML Web服務的基礎結構是構建來符合象SOAPXML和WSDL這樣的行業標准並且它允許其他的平台的客戶端與XML Web服務互操作只要一個客戶端可以發送符合標准的SOAP消息依據格式化的服務描述那麼這個客戶端可以調用一個使用ASPNET創建的XML Web服務(不管客戶端存在於何種平台)

  當你使用ASPNET構造一個XML Web服務時它自動支持客戶端使用SOAPHTTPGET和HTTPPOST協議通訊即使HTTPGET和HTTPPOST支持使用URL編碼的變量名/變量值對來傳送消息支持這兩個協議的數據類型也沒有支持SOAP協議的數據類型豐富在SOAP中使用XML把數據傳送到XML Web服務或從XML Web服務取回消息你可以使用支持豐富的數據類型集的XSD模式定義復雜的數據類型使用ASPNET構造一個XML Web服務的開發者不必明確地定義復雜的數據類型他們可以只構造一個管理類ASPNET處理定義到一個XSD模式的映射類和到XML數據的映射對象實例以便通過網絡傳輸

  重要的是要注意XML Web服務並不能取代DCOM我們應該說XML Web服務是跨越使用行業標准的平台通信的一種消息傳遞基礎結構

  因為ASPNET提供了為XML Web服務內部工作的基礎結構開發者可以集中精力來實現他們的特定的XML Web服務的功能使用ASPNET開發一個XML Web服務從下面三步開始

   創建一個帶有asmx擴展名的文件

   在這個文件裡面使用一條指令聲明XML Web服務

   定義組成XML Web服務功能的XML Web服務方法

  XML Web服務是一個強大的技術用於提供可通過因特網變成訪問的服務下面的建議將幫助你創建高效的XML Web服務

  XML Web服務既支持同步的又支持異步的客戶端和存放XML Web服務的服務器之間的通信在同步通信情況下客戶端發送一個對服務的請求到服務主機服務器上等待響應這防止客戶端在等待結果的時候執行其它的操作然而異步通信導致客戶端在等待相應的時候繼續處理其它的任務客戶端在可用的時候響應服務請求的結果

  當你使用Web服務描述語言工具(Wsdlexe)來創建你的代理類的時候它產生類中的方法的標准的同步版本和異步版本異步版本由兩個方法組成稱為Begin和EndBegin方法用於初始化XML Web服務而End方法取得結果

  使用異步通信能夠改善系統使用率和避免客戶端在它等待XML Web服務結果的時候的延遲

  下面的代碼示例顯示如何從一個客戶應用程序產生一個到XML Web服務的異步調用

  [C#]

  <%@ Page Language=C# %>

  <%@ Import Namespace=SystemNet %>

  <html>

  <script language=C# runat=server>

  void EnterBtn_Click(Object Src EventArgs E)

  {

  MyMathMath math = new MyMathMath();

  // Call to Add XML Web service method asynchronously

  // and then wait for it to complete

  IAsyncResult result =

  mathBeginAdd(ConvertToInt(NumText)

  ConvertToInt(NumText)

  null

  null);

  // Wait for asynchronous call to complete

  resultAsyncWaitHandleWaitOne();

  // Complete the asynchronous call to Add XML Web service method

  float total = mathEndAdd(result);

  // Display results in a Label control

  TotalText = Total: + totalToString();

  }

  </script>

  <body>

  <form action=MathClientaspx runat=server>

  <font face=Verdana>

  Enter the two numbers you want to add and then press

  the Total button

  <p>

  Number :

  <asp:textbox id=Num

  runat=server/>

  +

  Number :

  <asp:textbox id=Num

  runat=server/>

  =

  <asp:button id=Total_Button

  text=Total

  OnClick=EnterBtn_Click

  runat=server/>

  <p>

  <asp:label id=Total runat=server/>

  </font>

  </form>

  </body>

  </html>

  [Visual Basic]

  <%@ Page Language=VB %>

  <%@ Import Namespace=SystemNet %>

  <html>

  <script language=VB runat=server>

  Sub EnterBtn_Click(Src As Object E As EventArgs)

  Dim math As New MyMathMath()

   Call to Add XML Web service method asynchronously

   and then wait for it to complete

  Dim result As IAsyncResult = _

  mathBeginAdd(ConvertToInt(NumText) _

  ConvertToInt(NumText) _

  Nothing _

  Nothing)

   Wait for asynchronous call to complete

  resultAsyncWaitHandleWaitOne()

   Complete the asynchronous call to Add XML Web service method

  Dim addtotal As Single = mathEndAdd(result)

   Display results in a Label control

  TotalText = Total: & addtotalToString()

  End Sub

  </script>

  <body>

  <form action=MathClientaspx runat=server>

  <font face=Verdana>

  Enter the two numbers you want to add and then press

  the Total button

  <p>

  Number :

  <asp:textbox id=Num

  runat=server/>

  +

  Number :

  <asp:textbox id=Num

  runat=server/>

  =

  <asp:button id=Total_Button

  text=Total

  OnClick=EnterBtn_Click

  runat=server/>

  <p>

  <asp:label id=Total runat=server/>

  </font>

  </form>

  </body>

  </html>

  想獲得更多關於異步通信的信息請參閱後面的和XML Web服務異步地通訊

  通過因特網產生許多服務請求可能影響客戶應用程序的性能當設計你的XML Web服務時通過創建把有關信息集中在一起的方法可以有效利用服務請求例如假定你有一個XML Web服務用來檢索一本書的信息我們可以創建一個在一條服務請求中返回所有的信息的方法來代替單獨的檢索書名作者和出版社的方法一次傳送大塊的信息比多次傳送小塊的信息更有效率

  下面的代碼示例解釋如何把有關信息組織到單個XML Web服務方法中

  [C#]

  <%@ WebService Language=C# Class=DataService %>

  using System;

  using SystemData;

  using SystemDataSqlClient;

  using SystemWebServices;

  public class DataService {

  [WebMethod]

  public DataSet GetTitleAuthors() {

  SqlConnection myConnection = new SqlConnection(Persist Security Info=False;Integrated Security=SSPI;server=localhost;database=pubs);

  SqlDataAdapter myCommand = new SqlDataAdapter (select * from Authors myConnection);

  SqlDataAdapter myCommand = new SqlDataAdapter(select * from Titles myConnection);

  DataSet ds = new DataSet();

  myCommandFill(ds Authors);

  myCommandFill(ds Titles);

  return ds;

  }

  }

  [Visual Basic]

  <%@ WebService Language=VB Class=DataService %>

  Imports System

  Imports SystemData

  Imports SystemDataSqlClient

  Imports SystemWebServices

  Public Class DataService

  <WebMethod> _

  Public Function GetTitleAuthors() As DataSet

  Dim myConnection As New SqlConnection(Persist Security Info=False;Integrated Security=SSPI;server=localhost;database=pubs)

  Dim myCommand As New SqlDataAdapter(select * from Authors myConnection)

  Dim myCommand As New SqlDataAdapter(select * from Titles myConnection)

  Dim ds As New DataSet()

  myCommandFill(ds Authors)

  myCommandFill(ds Titles)

  Return ds

  End Function

  End Class

  

  當設計你的XML Web服務時請確保使用標准的面向對象編程操作使用封裝來隱藏實現細節對於更復雜的XML Web服務你可以使用繼承和多態性來再次使用代碼並簡化你的設計

  下面的代碼示例顯示如何使用繼承來創建一個執行數學計算的XML Web服務

  [C#]

  <%@ WebService Language=C# Class=Add %>

  using System;

  using SystemWebServices;

  abstract public class MathService : WebService

  {

  [WebMethod]

  abstract public float CalculateTotal(float a float b);

  }

  public class Add : MathService

  {

  [WebMethod]

  override public float CalculateTotal(float a float b)

  {

  return a + b;

  }

  }

  public class Subtract : MathService

  {

  [WebMethod]

  override public float CalculateTotal(float a float b)

  {

  return a b;

  }

  }

  public class Multiply : MathService

  {

  [WebMethod]

  override public float CalculateTotal(float a float b)

  {

  return a * b;

  }

  }

  public class Divide : MathService

  {

  [WebMethod]

  override public float CalculateTotal(float a float b)

  {

  if (b==)

  return ;

  else

  return a / b;

  }

  }

  [Visual Basic]

  <%@ WebService Language=VB Class=Add %>

  Imports System

  Imports SystemWebServices

  MustInherit Public Class MathService : Inherits WebService

  <WebMethod> _

  Public MustOverride Function CalculateTotal(a As Single _

  b As Single) As Single

  End Class

  Public Class Add : Inherits MathService

  <WebMethod> Public Overrides Function CalculateTotal(a As Single b As Single) As Single

  Return a + b

  End Function

  End Class

  Public Class Subtract : Inherits MathService

  <WebMethod> Public Overrides Function CalculateTotal(a As Single b As Single) As Single

  Return a b

  End Function

  End Class

  Public Class Multiply : Inherits MathService

  <WebMethod> Public Overrides Function CalculateTotal(a As Single b As Single) As Single

  Return a * b

  End Function

  End Class

  Public Class Divide : Inherits MathService

  <WebMethod> Public Overrides Function CalculateTotal(a As Single b As Single) As Single

  If b = Then

  Return

  Else

  Return a / b

  End If

  End Function

  End Class

  使用輸出緩沖來改善你的XML Web服務的性能當輸出緩沖開啟時服務請求的結果被保存在輸出緩沖中一段指定的時間如果一個類似的XML Web服務請求被產生結果可以從緩沖中取得而不用重新計算這樣就通過減少XML Web服務服務器所需的處理來改善了XML Web服務的反饋時間高速緩存可在客戶端和服務器兩者上執行Duration屬性允許你指定高速緩沖保存XML Web服務輸出的時間

  在客戶端上使用輸出高速緩沖的指令是

  <%@ OutputCache Duration= %>

  下面的代碼示例顯示如何在客戶應用程序上使用Duration屬性來指定輸出高速緩沖為

  [C#]

  <%@ Page Language=C# %>

  <%@ Import Namespace=SystemNet %>

  <%@ OutputCache Duration= VaryByParam=none %>

  <html>

  <script language=C# runat=server>

  void EnterBtn_Click(Object Src EventArgs e)

  {

  MyMathMath math = new MyMathMath();

  // Call the XML Web service

  float total = mathAdd(ConvertToInt(NumText)ConvertToInt(NumText));

  // Display the results in a Label control

  TotalText = Total: + totalToString();

  }

  </script>

  <body>

  <form action=MathClientaspx runat=server>

  <font face=Verdana>

  Enter the two numbers you want to add and press

  the Total button

  <p>

  Number :

  <asp:textbox id=Num runat=server/>

  + Number :

  <asp:textbox id=Num runat=server/>

  = <asp:button id=Total_Button text=Total OnClick=EnterBtn_Click runat=server/>

  <p>

  <asp:label id=Total runat=server/>

  </font>

  </form>

  </body>

  </html>

  [Visual Basic]

  <%@ Page Language=VB %>

  <%@ Import Namespace=SystemNet %>

  <%@ OutputCache Duration= VaryByParam=none %>

  <html>

  <script language=VB runat=server>

  Sub EnterBtn_Click(Src As Object e As EventArgs)

  Dim math As New MyMathMath()

   Call the XML Web service

  Dim addtotal As Single = mathAdd(ConvertToInt(NumText) ConvertToInt(NumText))

   Display the results in a Label control

  TotalText = Total: & addtotalToString()

  End Sub

  </script>

  <body>

  <form action=MathClientaspx runat=server>

  <font face=Verdana>

  Enter the two numbers you want to add and press

  the Total button

  <p>

  Number :

  <asp:textbox id=Num runat=server/>

  +

  Number :

  <asp:textbox id=Num runat=server/>

  = <asp:button id=Total_Button text=Total OnClick=EnterBtn_Click runat=server/>

  <p>

  <asp:label id=Total runat=server/>

  </font>

  </form>

  </body>

  </html>

  你還可以使用WebMethod屬性類的CacheDuration屬性來在服務器上允許高速緩沖下面的代碼示例顯示如何在XML Web服務方法上使用CacheDuration屬性來指定輸出高速緩沖為

  [C#]

  <%@ WebService Language=C# Class=MathService %>

  using System;

  using SystemWebServices;

  public class MathService : WebService {

  [WebMethod(CacheDuration=)]

  public float Add(float a float b)

  {

  return a + b;

  }

  [WebMethod(CacheDuration=)]

  public float Subtract(float a float b)

  {

  return a b;

  }

  [WebMethod(CacheDuration=)]

  public float Multiply(float a float b)

  {

  return a * b;

  }

  [WebMethod(CacheDuration=)]

  public float Divide(float a float b)

  {

  if (b==) return ;

  return a / b;

  }

  }

  [Visual Basic]

  <%@ WebService Language=VB Class=MathService %>

  Imports System

  Imports SystemWebServices

  Public Class MathService

  Inherits WebService

  <WebMethod(CacheDuration := )> _

  Public Function Add(a As Single b As Single) As Single

  Return a + b

  End Function

  <WebMethod(CacheDuration := )> _

  Public Function Subtract(a As Single b As Single) As Single

  Return a b

  End Function

  <WebMethod(CacheDuration := )> _

  Public Function Multiply(a As Single b As Single) As Single

  Return a * b

  End Function

  <WebMethod(CacheDuration := )> _

  Public Function Divide(a As Single b As Single) As Single

  If b = Then

  Return

  End If

  Return a / b

  End Function

  End Class

  當設計你的XML Web服務時努力遵循如何格式化模式的結構

  XML Web服務使用SOAP作為主要的傳送和序列化協議

  一個SOAP消息由一個可選擇的頭體和消息體組成頭部分包含可以被Web服務器體系結構處理的信息SOAP沒有定義任何頭消息體部分包含由應用程序處理的信息例如用於XML Web服務的參數或返回值

  提供用於你的XML Web服務的文檔如一個靜態HTML文件描述你的服務的操作和數據結構還包括如何使用這個XML Web服務的示例不要依靠服務描述或服務幫助頁面作為你唯一的文檔


From:http://tw.wingwit.com/Article/program/net/201311/11884.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.