明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

ASP.NET創(chuàng)建Web服務(wù)之設(shè)計(jì)方針

[摘要]使用ASP.NET構(gòu)造一個(gè)簡(jiǎn)單的XML Web服務(wù)是相對(duì)容易的,然而,XML Web服務(wù)的真正的強(qiáng)大的功能只有等你研究了基礎(chǔ)結(jié)構(gòu)以后才能領(lǐng)悟。XML Web服務(wù)是建立在.NET框架和公共語(yǔ)言運(yùn)行時(shí)間基礎(chǔ)上的。一個(gè)XML Web服務(wù)可以利用這些技術(shù)。例如,ASP.NET支持的性能、狀態(tài)管理和驗(yàn)證全都...

  使用ASP.NET構(gòu)造一個(gè)簡(jiǎn)單的XML Web服務(wù)是相對(duì)容易的,然而,XML Web服務(wù)的真正的強(qiáng)大的功能只有等你研究了基礎(chǔ)結(jié)構(gòu)以后才能領(lǐng)悟。XML Web服務(wù)是建立在.NET框架和公共語(yǔ)言運(yùn)行時(shí)間基礎(chǔ)上的。一個(gè)XML Web服務(wù)可以利用這些技術(shù)。例如,ASP.NET支持的性能、狀態(tài)管理和驗(yàn)證全都可被用來(lái)構(gòu)造XML Web服務(wù)。

  XML Web服務(wù)的基礎(chǔ)結(jié)構(gòu)是構(gòu)建來(lái)符合象SOAP、XML和WSDL這樣的行業(yè)標(biāo)準(zhǔn),并且它允許其他的平臺(tái)的客戶端與XML Web服務(wù)互操作。只要一個(gè)客戶端可以發(fā)送符合標(biāo)準(zhǔn)的SOAP消息、依據(jù)格式化的服務(wù)描述,那么這個(gè)客戶端可以調(diào)用一個(gè)使用ASP.NET創(chuàng)建的XML Web服務(wù)(不管客戶端存在于何種平臺(tái))。

  當(dāng)你使用ASP.NET構(gòu)造一個(gè)XML Web服務(wù)時(shí),它自動(dòng)支持客戶端使用SOAP、HTTP-GET和HTTP-POST協(xié)議通訊。即使HTTP-GET和HTTP-POST支持使用URL編碼的變量名/變量值對(duì)來(lái)傳送消息,支持這兩個(gè)協(xié)議的數(shù)據(jù)類型也沒(méi)有支持SOAP協(xié)議的數(shù)據(jù)類型豐富。在SOAP中,使用XML把數(shù)據(jù)傳送到XML Web服務(wù)或從XML Web服務(wù)取回消息,你可以使用支持豐富的數(shù)據(jù)類型集的XSD模式定義復(fù)雜的數(shù)據(jù)類型。使用ASP.NET構(gòu)造一個(gè)XML Web服務(wù)的開(kāi)發(fā)者不必明確地定義復(fù)雜的數(shù)據(jù)類型。他們可以只構(gòu)造一個(gè)管理類。ASP.NET處理定義到一個(gè)XSD模式的映射類和到XML數(shù)據(jù)的映射對(duì)象實(shí)例,以便通過(guò)網(wǎng)絡(luò)傳輸。

  重要的是要注意XML Web服務(wù)并不能取代DCOM,我們應(yīng)該說(shuō)XML Web服務(wù)是跨越使用行業(yè)標(biāo)準(zhǔn)的平臺(tái)通信的一種消息傳遞基礎(chǔ)結(jié)構(gòu)。

  因?yàn)锳SP.NET提供了為XML Web服務(wù)內(nèi)部工作的基礎(chǔ)結(jié)構(gòu),開(kāi)發(fā)者可以集中精力來(lái)實(shí)現(xiàn)他們的特定的XML Web服務(wù)的功能。使用ASP.NET開(kāi)發(fā)一個(gè)XML Web服務(wù)從下面三步開(kāi)始:

  1. 創(chuàng)建一個(gè)帶有.asmx擴(kuò)展名的文件。

  2. 在這個(gè)文件里面,使用一條指令聲明XML Web服務(wù)。

  3. 定義組成XML Web服務(wù)功能的XML Web服務(wù)方法。

  XML Web服務(wù)是一個(gè)強(qiáng)大的技術(shù),用于提供可通過(guò)因特網(wǎng)變成訪問(wèn)的服務(wù)。下面的建議將幫助你創(chuàng)建高效的XML Web服務(wù):

  XML Web服務(wù)既支持同步的又支持異步的客戶端和存放XML Web服務(wù)的服務(wù)器之間的通信。在同步通信情況下,客戶端發(fā)送一個(gè)對(duì)服務(wù)的請(qǐng)求到服務(wù)主機(jī)服務(wù)器上等待響應(yīng)。這防止客戶端在等待結(jié)果的時(shí)候,執(zhí)行其它的操作。然而異步通信導(dǎo)致客戶端在等待相應(yīng)的時(shí)候繼續(xù)處理其它的任務(wù)?蛻舳嗽诳捎玫臅r(shí)候響應(yīng)服務(wù)請(qǐng)求的結(jié)果。

  當(dāng)你使用Web服務(wù)描述語(yǔ)言工具(Wsdl.exe)來(lái)創(chuàng)建你的代理類的時(shí)候,它產(chǎn)生類中的方法的標(biāo)準(zhǔn)的、同步版本和異步版本。異步版本由兩個(gè)方法組成,稱為Begin和End。Begin方法用于初始化XML Web服務(wù),而End方法取得結(jié)果。

  使用異步通信能夠改善系統(tǒng)使用率和避免客戶端在它等待XML Web服務(wù)結(jié)果的時(shí)候的延遲。

  下面的代碼示例顯示如何從一個(gè)客戶應(yīng)用程序產(chǎn)生一個(gè)到XML Web服務(wù)的異步調(diào)用。

[C#]
<%@ Page Language="C#" %>
<%@ Import Namespace="System.Net" %>
<html>
<script language="C#" runat="server">
void EnterBtn_Click(Object Src, EventArgs E)
{
MyMath.Math math = new MyMath.Math();
// Call to Add XML Web service method asynchronously
// and then wait for it to complete.
IAsyncResult result =
math.BeginAdd(Convert.ToInt32(Num1.Text),
Convert.ToInt32(Num2.Text),
null,
null);
// Wait for asynchronous call to complete.
result.AsyncWaitHandle.WaitOne();
// Complete the asynchronous call to Add XML Web service method.
float total = math.EndAdd(result);
// Display results in a Label control.
Total.Text = "Total: " + total.ToString();
}
</script>
<body>
<form action="MathClient.aspx" runat=server>
<font face="Verdana">
Enter the two numbers you want to add and then press
the Total button.
<p>
Number 1:
<asp:textbox id="Num1"
runat=server/>
+
Number 2:
<asp:textbox id="Num2"
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="System.Net" %>
<html>
<script language="VB" runat="server">
Sub EnterBtn_Click(Src As Object, E As EventArgs)
Dim math As New MyMath.Math()
' Call to Add XML Web service method asynchronously
' and then wait for it to complete.
Dim result As IAsyncResult = _
math.BeginAdd(Convert.ToInt32(Num1.Text), _
Convert.ToInt32(Num2.Text), _
Nothing, _
Nothing)

' Wait for asynchronous call to complete.
result.AsyncWaitHandle.WaitOne()
' Complete the asynchronous call to Add XML Web service method.
Dim addtotal As Single = math.EndAdd(result)
' Display results in a Label control.
Total.Text = "Total: " & addtotal.ToString()
End Sub
</script>
<body>
<form action="MathClient.aspx" runat=server>
<font face="Verdana">
Enter the two numbers you want to add and then press
the Total button.
<p>
Number 1:
<asp:textbox id="Num1"
runat=server/>
+
Number 2:
<asp:textbox id="Num2"
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>

  想獲得更多關(guān)于異步通信的信息,請(qǐng)參閱后面的"和XML Web服務(wù)異步地通訊"。
  通過(guò)因特網(wǎng)產(chǎn)生許多服務(wù)請(qǐng)求可能影響客戶應(yīng)用程序的性能。當(dāng)設(shè)計(jì)你的XML Web服務(wù)時(shí),通過(guò)創(chuàng)建把有關(guān)信息集中在一起的方法可以有效利用服務(wù)請(qǐng)求。例如,假定你有一個(gè)XML Web服務(wù),用來(lái)檢索一本書(shū)的信息。我們可以創(chuàng)建一個(gè)在一條服務(wù)請(qǐng)求中返回所有的信息的方法,來(lái)代替單獨(dú)的檢索書(shū)名、作者和出版社的方法。一次傳送大塊的信息比多次傳送小塊的信息更有效率。

  下面的代碼示例解釋如何把有關(guān)信息組織到單個(gè)XML Web服務(wù)方法中。

[C#]
<%@ WebService Language="C#" Class="DataService" %>
using System;
using System.Data;
using System.Data.SqlClient;
using System.Web.Services;
public class DataService {
[WebMethod]
public DataSet GetTitleAuthors() {
SqlConnection myConnection = new SqlConnection("Persist Security Info=False;Integrated Security=SSPI;server=localhost;database=pubs");
SqlDataAdapter myCommand1 = new SqlDataAdapter ("select * from Authors", myConnection);
SqlDataAdapter myCommand2 = new SqlDataAdapter("select * from Titles", myConnection);
DataSet ds = new DataSet();
myCommand1.Fill(ds, "Authors");
myCommand2.Fill(ds, "Titles");
return ds;
}
}
[Visual Basic]
<%@ WebService Language="VB" Class="DataService" %>
Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports System.Web.Services
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 myCommand1 As New SqlDataAdapter("select * from Authors", myConnection)
Dim myCommand2 As New SqlDataAdapter("select * from Titles", myConnection)
Dim ds As New DataSet()
myCommand1.Fill(ds, "Authors")
myCommand2.Fill(ds, "Titles")
Return ds
End Function
End Class

  當(dāng)設(shè)計(jì)你的XML Web服務(wù)時(shí),請(qǐng)確保使用標(biāo)準(zhǔn)的面向?qū)ο缶幊滩僮。使用封裝來(lái)隱藏實(shí)現(xiàn)細(xì)節(jié)。對(duì)于更復(fù)雜的XML Web服務(wù),你可以使用繼承和多態(tài)性來(lái)再次使用代碼并簡(jiǎn)化你的設(shè)計(jì)。

  下面的代碼示例顯示如何使用繼承來(lái)創(chuàng)建一個(gè)執(zhí)行數(shù)學(xué)計(jì)算的XML Web服務(wù)。

[C#]
<%@ WebService Language="C#" Class="Add" %>
using System;
using System.Web.Services;
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==0)
   return -1;
  else
   return a / b;
 }
}
[Visual Basic]
<%@ WebService Language="VB" Class="Add" %>
Imports System
Imports System.Web.Services
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 = 0 Then
  Return - 1
 Else
  Return a / b
 End If
End Function
End Class
 
  使用輸出緩沖來(lái)改善你的XML Web服務(wù)的性能。當(dāng)輸出緩沖開(kāi)啟時(shí),服務(wù)請(qǐng)求的結(jié)果被保存在輸出緩沖中一段指定的時(shí)間。如果一個(gè)類似的XML Web服務(wù)請(qǐng)求被產(chǎn)生,結(jié)果可以從緩沖中取得,而不用重新計(jì)算。這樣就通過(guò)減少XML Web服務(wù)服務(wù)器所需的處理來(lái)改善了XML Web服務(wù)的反饋時(shí)間。高速緩存可在客戶端和服務(wù)器兩者上執(zhí)行。Duration屬性允許你指定高速緩沖保存XML Web服務(wù)輸出的時(shí)間。

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

<%@ OutputCache Duration="60" %>

  下面的代碼示例顯示如何在客戶應(yīng)用程序上使用Duration屬性來(lái)指定輸出高速緩沖為60秒。

[C#]
<%@ Page Language="C#" %>
<%@ Import Namespace="System.Net" %>
<%@ OutputCache Duration="60" VaryByParam="none" %>
<html>
<script language="C#" runat="server">
void EnterBtn_Click(Object Src, EventArgs e)
{
 MyMath.Math math = new MyMath.Math();
 // Call the XML Web service.
 float total = math.Add(Convert.ToInt32(Num1.Text),
 Convert.ToInt32(Num2.Text));
 // Display the results in a Label control.
 Total.Text = "Total: " + total.ToString();
}
</script>
<body>
<form action="MathClient.aspx" runat=server>
<font face="Verdana">
Enter the two numbers you want to add and press
the Total button.
<p>
Number 1:
<asp:textbox id="Num1" runat=server/>
+ Number 2:
<asp:textbox id="Num2" 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="System.Net" %>
<%@ OutputCache Duration="60" VaryByParam="none" %>
<html>
<script language="VB" runat="server">
Sub EnterBtn_Click(Src As Object, e As EventArgs)
 Dim math As New MyMath.Math()
 ' Call the XML Web service.
 Dim addtotal As Single = math.Add(Convert.ToInt32(Num1.Text), Convert.ToInt32(Num2.Text))
 ' Display the results in a Label control.
 Total.Text = "Total: " & addtotal.ToString()
End Sub
</script>
<body>
<form action="MathClient.aspx" runat=server>
<font face="Verdana">
Enter the two numbers you want to add and press
the Total button.
<p>
Number 1:
<asp:textbox id="Num1" runat=server/>
+
Number 2:
<asp:textbox id="Num2" 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屬性來(lái)在服務(wù)器上允許高速緩沖。下面的代碼示例顯示如何在XML Web服務(wù)方法上使用CacheDuration屬性來(lái)指定輸出高速緩沖為60秒。

[C#]
<%@ WebService Language="C#" Class="MathService" %>
using System;
using System.Web.Services;
public class MathService : WebService {
[WebMethod(CacheDuration=60)]
public float Add(float a, float b)
{
return a + b;
}
[WebMethod(CacheDuration=60)]
public float Subtract(float a, float b)
{
return a - b;
}
[WebMethod(CacheDuration=60)]
public float Multiply(float a, float b)
{
return a * b;
}
[WebMethod(CacheDuration=60)]
public float Divide(float a, float b)
{
if (b==0) return -1;
return a / b;
}
}
[Visual Basic]
<%@ WebService Language="VB" Class="MathService" %>
Imports System
Imports System.Web.Services
Public Class MathService
Inherits WebService
<WebMethod(CacheDuration := 60)> _
Public Function Add(a As Single, b As Single) As Single
Return a + b
End Function

<WebMethod(CacheDuration := 60)> _
Public Function Subtract(a As Single, b As Single) As Single
Return a - b
End Function

<WebMethod(CacheDuration := 60)> _
Public Function Multiply(a As Single, b As Single) As Single
Return a * b
End Function

<WebMethod(CacheDuration := 60)> _
Public Function Divide(a As Single, b As Single) As Single
If b = 0 Then
Return - 1
End If
Return a / b
End Function
End Class

  當(dāng)設(shè)計(jì)你的XML Web服務(wù)時(shí),努力遵循如何格式化模式的結(jié)構(gòu)。

  XML Web服務(wù)使用SOAP作為主要的傳送和序列化協(xié)議。一個(gè)SOAP消息由一個(gè)可選擇的頭體和消息體組成。頭部分包含可以被Web服務(wù)器體系結(jié)構(gòu)處理的信息。SOAP沒(méi)有定義任何頭。消息體部分包含由應(yīng)用程序處理的信息,例如用于XML Web服務(wù)的參數(shù)或返回值。

  提供用于你的XML Web服務(wù)的文檔,如一個(gè)靜態(tài)HTML文件,描述你的服務(wù)的操作和數(shù)據(jù)結(jié)構(gòu)。還包括如何使用這個(gè)XML Web服務(wù)的示例。不要依靠服務(wù)描述或服務(wù)幫助頁(yè)面作為你唯一的文檔。