Microsoft .NET 架構和 Visual Studio.NET 中的 SOAP

來源:互聯網
上載者:User
visual 摘要:關於 .NET Remoting、ASP.NET Web Services 和 ATL Web Services 中 SOAP 功能的討論。

目錄
簡介
將 SOAP 用作 Web 開發工具
將 SOAP 用作組件開發工具
將 SOAP 用作 ATL 開發工具
總結

簡介
Microsoft® .NET 架構和 Microsoft® Visual Studio.NET 利用 XML 和 SOAP 技術,使開發人員能夠建立廣泛的解決方案。SOAP 是一個簡單、輕便、並在業界獲得廣泛支援的協議,適用於各種各樣的應用,它與 .NET 架構的結合簡單而合乎自然。

從底層開始,SOAP 的設計目標就是使之成為一種非常簡單的協議,能夠以各種不同的方式滿足各種不同的需求。除了 Microsoft,已有許多公司實際應用 SOAP,例如 IBM、Develop Mentor 和 Userland。

在使用 SOAP 的體系中,有若干種關鍵技術。在建立基於 SOAP 的解決方案時,每種技術都會解決開發人員的一些共同問題。這些技術分別屬於 .NET Remoting、ASP.NET Web Services 和 ATL Web Services,它們具有許多共同的技術特點:

用於訊息產生和使用的 XML。


符合 SOAP 1.1 規範,包括第 5 節 SOAP 編碼,這使 SOAP 應用之間具有很好的互通性。


XML 保真性(非第 5 節 SOAP 編碼),用於完全斷開的模型。


WSDL(XML 方案的一種形式),用於提供說明。


可用無狀態編程模型擴充系統。


使用 Visual Studio.NET 的良好開發環境。
ASP.NET Web Services 和 .NET Remoting 還共用下列技術:

XCOPY 系統部署。


System.Net,進行網路通訊時,無論在伺服器還是用戶端它都運行良好。


通用語言執行平台可在受控代碼和線程緩衝池中重用。


提供強大的 SOAP 支援,例如 SOAP 頭和單向訊息等特性。


能夠與 C#、Visual Basic.NET 或任何符合 CLS 規範 規範的語言(如 Cobol、Python、 ComponentPascal 等等)配合使用來編寫應用程式。
除了以上列出的共同特點和技術以外,ASP.NET Web Services、.NET Remoting 和 ATL Web Services 還分別為開發人員提供了許多特有的功能,下面這些內容有助於開發人員在產生應用程式時把握正確的方向。

如果您要產生 .ASP 應用程式,ASP.NET Web Services:
允許與 ASP.NET HTTP 運行時緊密整合。


鼓勵開發人員著重於運用 XSD 資料類型來提供應用程式。


在 Visual Studio.NET 中提供強大的設計支援。
如果您要產生 MTS/COM+ 應用程式,.NET Remoting:
提供全面的受控代碼類型系統的網路保真性。


提供在網路上通過引用來傳遞對象的功能,並且可返回到特定進程中的特定對象。


提供二進位通訊能力。
如果您要產生 ATL/C++ 應用程式,ATL Server:
提供靈活並且可控的本機 (C++) 解決方案。


建立於 ATL Server ISAPI Web 應用程式體系機構之上(利用線程緩衝池、緩衝,等等)。
將 SOAP 用作 Web 開發工具
ASP.NET Web Services 提供了 RAD 方式,以供快速建立和使用 Web 服務。這些服務寬鬆地組合在一起,並可與 ASP.NET 高度整合。ASP.NET Web Services 是 Web 開發人員在 Internet 上提供 Web 服務的首選方法,它的目標是提供快速、簡便、效能優越的 SOAP 服務。

ASP.NET Web Services 可以和 ASP.NET HTTP 引擎深入整合,這使得熟悉 Microsoft Web 開發技術的開發人員能夠方便地產生和使用基於 SOAP 的 Web 服務。

ASP.NET 以 .asmx 檔案提供對 Web Services 的支援。.asmx 檔案是與 .aspx 檔案相似的文字檔。這些檔案可以是包含 .aspx 檔案的 ASP.NET 應用程式的一部分。它們可以使用 URI 定址方式,這和 .aspx 檔案相同。

以下是一個非常簡單的 .asmx 檔案樣本:

<%@ WebService Language="C#" Class="HelloWorld" %>

using System;
using System.Web.Services;

public class HelloWorld : WebService {

[WebMethod] public String SayHelloWorld() {
return "Hello World";
}

}

這個檔案以 ASP.NET 指示的 Web Service 開始,並將語言設定為 C#(也可以將語言設定為 Microsoft Visual Basic®、C 或大約 30 種第三方語言中的任何一種)。然後,它將匯入名稱空間 System.Web.Services。這個名稱空間是必要的,您必須在檔案中包括它。下一步,聲明 HelloWorld 類。這個類從基類 WebService 匯出。最後,任何要作為服務的一部分來訪問的方法在它們的簽名之前將具有自訂屬性 [WebMethod],在 Visual Basic 中則為“<WebMethod()>”。

要使這個服務生效,可以將檔案命名為 HelloWorld.asmx,然後將它放在虛擬目錄 Bar 中的伺服器 Foo 上。使用幾乎任何相容 HTML 3.2 或更高版本的瀏覽器,都可以輸入 URL http://Foo/Bar/HelloWorld.asmx 來顯示這個 Web Service 的公用方法(標有 WebMethod 屬性),以及那些可用來調用這些方法的協議,例如 SOAP 或 HTTP GET。如果在 Internet Explorer 地址欄中輸入 http://Foo/Bar/HelloWorld.asmx?SDL,基於服務說明語言 (WSDL) 文法,將產生與 XML 檔案相同的資訊。這個 WSDL 檔案由訪問服務的客戶使用,並且非常重要。

訪問 Web Serivces
除了使開發人員能夠建立 Web Services 的技術之外,Microsoft .NET 架構還提供了一套用來“使用”(即以用戶端身份訪問)Web Services 的成熟工具與代碼。因為 Web Services 基於簡易物件存取通訊協定 (SOAP) (SOAP) 和 HTTP 等開放協議,所以這種用戶端技術也可以用於使用非 ASP.NET Web Services。

SDK 中有一種稱為 WebServiceUtil.exe 的工具(在 VS IDE 中使用“Add Web Reference...”選項時自動生效)。這個程式可用於下載 Web Service 的 WSDL 說明,然後建立表示這個服務的地址的代理類。例如,您可以輸入:

WebServiceUtil /c:proxy /pa:http://someDomain.com/someFolder/HelloWorld.asmx?SDL

然後,系統將建立稱為 HelloWorld.cs 的代理類。

這個類與前面建立的類看起來非常相似。它包括稱為 SayHelloWorld 的方法,該方法返回字串。將這個代理類編譯到應用程式中,然後調用其方法,結果是代理類在 HTTP 上打包 SOAP 請求,並接收 SOAP 編碼的回應,然後封送為一個字串。

從用戶端來看,代碼非常簡單:

Dim myHelloWorld As New HelloWorld()
Dim sReturn As String = myHelloWorld.SayHelloWorld()

傳回值將是“Hello World”。

將 SOAP 用作組件開發工具
建立分布式應用程式時,如果需要高度控制性並要求能夠選擇系統耦合程度,那麼可以使用 Microsoft .NET Remoting。

Microsoft .NET Remoting 還提供了與通用語言執行平台的深入整合,並且為開發人員提供了全面的跨連線類型系統保真性。這包括建構函式、委託、重載方法、通過值和引用傳遞對象、類的階層、介面、方法、屬性、欄位,以及通過可插入通道、分布式標識、啟用、租用生存期和 CallContext(獨立於參數的 SOAP 頭中的流對象)在串連上的應用程式 (Web Services) 之間進行 Marshal by Value(製作副本)以及 Marshal by Ref(傳遞 ObjRef)。

使用 .NET Remoting,開發人員可以從任何進程提供 Remoting 終結點,包括控制台應用、GUI 應用、NT Service 和 IIS。在任何使用有效載入編碼(在產品中提供了可插入序列化格式化程式以及 SOAP 和二進位格式化程式)通過可插入通道進行的任何傳輸過程中都會出現這種情況。SOAP=HTTP+XML,同時完全支援 HTTP 和 SMTP 上的 SOAP 1.1,這十分令人滿意。

我們可以獲得 WSDL 支援來說明 Web Service 並保證運行時類型系統的完全保真性。.NET Remoting 提供了 .NET SDK 的 Soapsuds 工具,可以從中繼資料產生受控類和 COM 物件的服務說明。Soapsuds 工具也使用服務說明並產生中繼資料和代理。開發人員可以使用密集偵聽模型,將自己的操作作為應用程式入站和出站訊息流程插入。想更為深入的開發人員則可以採用使用通訊端的二進位編碼 TCP 通道。

.NET Remoting 使受控組件、本機 COM/COM+ 組件以及接受服務的組件(使用 COM+ 服務的受控組件)遠程化。SOAP、二進位以及任何一種可插入通道和格式上都可能出現這些情況。

範例:SOAP 受控代碼事件
下列代碼示範如何在兩個應用程式之間引發受控代碼事件。用戶端有一個本機物件,註冊為接收遠程對象的事件通知。用戶端呼叫伺服器對象時,就引發事件,產生對用戶端本機物件的回叫。

伺服器端
zap.cs
using System;

namespace Zap
{
// 定義事件參數
public class GreetingEventArgs : EventArgs
{
public GreetingEventArgs(string greeting)
{
this.greeting = greeting;
}

public string greeting;
}

// 定義事件
public delegate void GreetingEvent(object sender,
GreetingEventArgs e);

// 定義服務
public class Waz : MarshalByRefObject
{
// 用戶端將預定和取消預定此事件
public event GreetingEvent Greeting;

// 由用戶端遠程調用的方法
public void HelloMethod(string greeting)
{
Console.WriteLine("Received String {0}", greeting);

// 將字串打包到 GreetingEventArgs 中
GreetingEventArgs e = new GreetingEventArgs(greeting);

// 引發事件
if (Greeting != null)
{
Greeting(this, e);
}
}
}
}

host.cs

using System;
using System.IO;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels.HTTP;

public class Host
{
public static void Main(string[] args)
{
// 手動載入 http 通道。
// 這也可以在 Remoting 設定檔中完成。
ChannelServices.RegisterChannel(new HTTPChannel(999));

// 註冊伺服器類型。
// 這也可以在 Remoting 設定檔中完成。
RemotingServices.RegisterWellKnownType(
"Zap", // 程式集
"Zap.Waz", // 完整的類名
"host/Waz.soap", // URI
WellKnownObjectMode.Singleton); // 對象模式

// 完成操作,等候使用者退出
Console.WriteLine("主機已經準備好處理遠程訊息。");
Console.WriteLine("請按 ENTER 鍵退出");
String keyState = Console.ReadLine();
}
}

用戶端
client.cs

using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels.HTTP;

using Zap;

// 將對象按引用本地封送到要引發的事件
public class Baz : MarshalByRefObject
{
public void GreetingHandler(object sender, GreetingEventArgs e)
{
Console.WriteLine("GreetingHandler 回叫: 問候: {0}\n",
e.greeting);
}
}

public class Client
{
public static void Main(String[] args)
{
Baz baz = new Baz();

// 這也可以在 Remoting 設定檔中完成。

// 註冊 HTTP 通道
ChannelServices.RegisterChannel(new HTTPChannel(0));

// 擷取 SOAP URL 代理
Waz waz = (Waz)Activator.GetObject(
typeof(Waz),
"http://localhost:999/host/Waz.soap"
);


// 預定事件: 通過 SOAP 進行
waz.Greeting += new GreetingEvent(baz.GreetingHandler);

for (int i = 0; i < 5; i++)
{
// 通過 SOAP 向 waz 發送
waz.HelloMethod("Bill" + " " + i);
}

// 取消預定事件: 通過 SOAP 進行
waz.Greeting -= new GreetingEvent(baz.GreetingHandler);
}
}

Makefile
makefile

all: Host.exe Zap.dll Client.exe

Host.exe: Host.cs
csc /r:System.Runtime.Remoting.dll Host.cs

Zap.dll: Zap.cs
csc /t:library -out:Zap.dll Zap.cs

Client.exe: Zap.dll Client.cs
csc /r:System.Runtime.Remoting.dll /r:Zap.dll Client.cs

在一個視窗中啟動 host.exe 檔,然後在另一個視窗中啟動 client.exe 檔。您將會看到事件被引發回到用戶端。

這是諸多 .NET Remoting 應用程式中的一個小例子。.NET Remoting 提供了網路上的完全 CLR 受控代碼類型系統,它還是優秀的 SOAP 伺服器和用戶端,因為它完全符合 SOAP 1.1 規範。

將 SOAP 用作 ATL 開發工具
ATL Server Web Services 為 C++ 開發人員提供了在機器碼中建立和使用 Web Services 的簡便方式。ATL Server 是 C++ 開發人員在 Internet 上提供和使用 Web Services 的首選方法,其設計目的是為包含 SOAP 的 Web 應用程式提供快速、輕便和高度靈活的程式庫。

ATL Server 之所以稱為 ATL,是因為它體現了同時追求高效能和靈活性的 ATL 目標。例如,您可以很容易地拋開 ATL Server HTTP 模型,編寫您自己的發送器,同時仍然獲得 ATL Server 封送/協議代碼的好處。

ATL Server Web Services 使用與 COM 相似的文法說明介面,便於目前的 ATL 開發人員學習。這種與 COM 相似的文法允許開發人員輕而易舉地將對象同時以 COM 物件和 Web Service 方式提供。

屬性的引入大大簡化了代碼,使它對於非 ATL 開發人員也很容易。ATL Server 具有和其他所有 .NET Web Services 進行互操作的能力,這對那些在一個應用程式中使用多種技術的開發人員來說十分方便。

介面:新的 __interface 關鍵字使開發人員很容易建立 COM 物件或 Web Services 介面。

[
uuid("D7DAE6FD-AEBB-4579-BD8D-866F74139501"),
object
]
__interface IWeb_Service_ExampleService
{
[id(1)] HRESULT HelloWorld([in] BSTR bstrInput, [out, retval] BSTR *bstrOutput);
};

這是一個運用 ATL Server 定義 Web Service 介面的例子。通過 C++ 屬性的運用,嵌入式 IDL 屬性和新的 __interface 關鍵字、ATL Server Web Service 介面看起來和新的屬性化的 COM 介面非常相似。這裡的 Web Service 介面範例 IWeb_Service_ExampleService 僅實現一個方法 HelloWorld。HelloWorld 用 BSTR 作為輸入並返回 BSTR 作為輸出。

請求處理常式:請求處理常式是一個 C++ 類,該類通過處理常式映射來提供,並且具有通過替代方法映射來提供的方法。處理常式映射只是文字標籤與類名稱的映射,而方法映射是類中文字標籤與方法的映射。

[
request_handler(name="Default",sdl="GenWeb_Service_ExampleServiceSDL"),
soap_handler(
name="Web_Service_ExampleService",
namespace="urn:Web_Service_ExampleService",
protocol="soap"
)
]
class CWeb_Service_ExampleService:
public IWeb_Service_ExampleService
{
public:

[ soap_method ]
HRESULT HelloWorld(BSTR bstrInput, BSTR *bstrOutput)
{
CComBSTR bstrOut(L"Hello ");
bstrOut += bstrInput;
bstrOut += L"!";
*bstrOutput = bstrOut.Detach();

return S_OK;
}
};

ATL Server 請求處理常式模型與 Web 應用程式和 Web Services 非常相似。圖 1 顯示了處理請求的模型:



圖 1. ATL Server 請求處理模型

HTTP Request 進入 IIS,將請求(基於 URL 及其擴充)映射到適當的 ISAPI DLL。然後,ISAPI DLL 把在請求中指定的處理常式(即在標籤或查詢參數中指定的處理常式)映射到適當的 Application DLL。Application DLL 再將這個處理常式映射到 C++ 對象。在這個模型(ATL Server 模型)中,Web 應用程式和 Web Service 的唯一差別在於最後一步。使用 Web Services,C++ 對象能夠解碼/編碼 SOAP(當編譯器解析 soap_handler 屬性時,它會插入執行此操作的代碼)。

您可以理解,這個類是從我們的介面繼承過來的,並且我們使用 [soap_method] 屬性指示將由 HelloWorld 方法來處理 SOAP 請求。實現這種方法和實現任何其他 C++ 方法是一樣的。

這個 soap_handler 屬性還確保自動產生有效說明服務的 WSDL。Web Service 的使用者使用這個對服務的說明(格式為 XML/WSDL),確保他們能夠以正確的格式發送/接收正確的資料。

通過 ATL Server 使用 Web Services
通過 ATL Server 使用 Web Services 相對來說是個比較簡單的操作。開發人員只需使用 “Add Web Reference” 對話方塊,將它指向 .disco 檔案,然後指向 WSDL,這和使用其他類型的 Web 參考一樣。這個對話方塊在後台運行在 Web Service 的 WSDL 上的 sproxy.exe 公用程式(對於非原生 .NET Web Services 有另外一個公用程式)。

該操作將建立 Web Service 代理檔案,包含要求利用所請求的 Web Service 的全部 C++ 代碼。使用 WSDL 中的資訊,代理產生器能夠判斷 Web Service 要接收到的資料以及它要返回給用戶端的資料。這就允許代理產生器建立可以和 Web Service“交談”的標頭檔。

您只需建立自己的 Web Service 類(如在產生的標頭檔中尋找到的一樣)的執行個體,並且使用合適的方法即可,例如:

CWeb_Service_ExampleServiceService MyService;
CComBSTR bstrOut;
CComBSTR bstrIn(L"World");
MyService.HelloWorld ( bstrIn ,&bstrOut,);
wprintf(bstrOut);

現在,您就已經有一個基本的 ATL Server Web Service 和 ATL Server Web Service Consumer 了。

總結
本文的主要目的是對 .NET 架構和 Visual Studio.NET 中的 SOAP 功能作一個總體的介紹。其次,就如何建立使用 SOAP 的應用程式,給使用者一些有益的指導。


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.