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

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

.NET框架和VS.NET中的SOAP

2019-11-17 04:40:03
字體:
供稿:網(wǎng)友
簡介

  Microsoft? .NET 框架和 Microsoft? Visual Studio.NET 利用 xml 和 SOAP 技術(shù),使開發(fā)人員能夠創(chuàng)建廣泛的解決方案。
SOAP 是一個(gè)簡單、輕便、并在業(yè)界獲得廣泛支持的協(xié)議,適用于各種各樣的應(yīng)用,它與 .NET 框架的結(jié)合簡單而合乎自然。

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

  在使用 SOAP 的體系中,有若干種要害技術(shù)。在創(chuàng)建基于 SOAP 的解決方案時(shí),每種技術(shù)都會解決開發(fā)人員的一些共同問題。這些技術(shù)分別屬于 .NET Remoting、asp.net Web Services 和 ATL Web Services,它們具有許多共同的技術(shù)特點(diǎn):

   用于消息生成和使用的 XML。

   符合 SOAP 1.1 規(guī)范,包括第 5 節(jié) SOAP 編碼,這使 SOAP 應(yīng)用之間具有很好的互操作性。

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

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

   可用無狀態(tài)編程模型擴(kuò)展系統(tǒng)。

  使用 Visual Studio.NET 的良好開發(fā)環(huán)境。

  ASP.NET Web Services 和 .NET Remoting 還共享下列技術(shù):

   XCOPY 系統(tǒng)部署。

   System.Net,進(jìn)行網(wǎng)絡(luò)通訊時(shí),無論在服務(wù)器還是客戶端它都運(yùn)行良好。

   公共語言運(yùn)行時(shí)可在受控代碼和線程緩沖池中重用。

   提供強(qiáng)大的 SOAP 支持,例如 SOAP 頭和單向消息等特性。

   能夠與 C#、Visual Basic.NET 或任何符合 CLS 規(guī)范的語言(如 Cobol、Python、 ComponentPascal 等等)配合使用來編寫應(yīng)用程序。

  除了以上列出的共同特點(diǎn)和技術(shù)以外,ASP.NET Web Services、.NET Remoting 和 ATL Web Services 還分別為開發(fā)人員提供了許多特有的功能,下面這些內(nèi)容有助于開發(fā)人員在生成應(yīng)用程序時(shí)把握正確的方向。
  假如您要生成 .ASP 應(yīng)用程序,ASP.NET Web Services:

   答應(yīng)與 ASP.NET HTTP 運(yùn)行時(shí)緊密集成。

   鼓勵開發(fā)人員著重于運(yùn)用 XSD 數(shù)據(jù)類型來提供給用程序。

   在 Visual Studio.NET 中提供強(qiáng)大的設(shè)計(jì)支持。

  假如您要生成 MTS/COM+ 應(yīng)用程序,.NET Remoting:

   提供全面的受控代碼類型系統(tǒng)的網(wǎng)絡(luò)保真性。

   提供在網(wǎng)絡(luò)上通過引用來傳遞對象的功能,并且可返回到特定進(jìn)程中的特定對象。

   提供二進(jìn)制通訊能力。

  假如您要生成 ATL/C++ 應(yīng)用程序,ATL Server:

   提供靈活并且可控的本機(jī) (C++) 解決方案。

   建立于 ATL Server ISAPI Web 應(yīng)用體系機(jī)構(gòu)之上(利用線程緩沖池、緩存,等等)。

  將 SOAP 用作 Web 開發(fā)工具

  ASP.NET Web Services 提供了 RAD 方式,以供快速創(chuàng)建和使用 Web 服務(wù)。這些服務(wù)寬松地組合在一起,并可與 ASP.NET 高度集成。ASP.NET Web Services 是 Web 開發(fā)人員在 Internet 上提供 Web 服務(wù)的首選方法,它的目標(biāo)是提供快速、簡便、性能優(yōu)越的 SOAP 服務(wù)。

  ASP.NET Web Services 可以和 ASP.NET HTTP 引擎深入集成,這使得熟悉 Microsoft Web 開發(fā)技術(shù)的開發(fā)人員能夠方便地生成和使用基于 SOAP 的 Web 服務(wù)。

  ASP.NET 以 .asmx 文件提供對 Web Services 的支持。.asmx 文件是與 .aspx 文件相似的文本文件。這些文件可以是包含 .aspx 文件的 ASP.NET 應(yīng)用程序的一部分。它們可以使用 URI 尋址方式,這和 .aspx 文件相同。

  以下是一個(gè)非常簡單的 .asmx 文件示例:


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

 using System;
 using System.Web.Services;

 public class HelloWorld : WebService {

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

}
  這個(gè)文件以 ASP.NET 指示的 Web Service 開始,并將語言設(shè)置為 C#(也可以將語言設(shè)置為 Microsoft Visual Basic?、C 或大約 30 種第三方語言中的任何一種)。然后,它將導(dǎo)入名稱空間 System.Web.Services。這個(gè)名稱空間是必要的,您必須在文件中包括它。下一步,聲明 HelloWorld 類。這個(gè)類從基類 WebService 導(dǎo)出。最后,任何要作為服務(wù)的一部分來訪問的方法在它們的簽名之前將具有自定義屬性 [WebMethod],在 Visual Basic 中則為“<WEBMETHOD()>”。

  要使這個(gè)服務(wù)生效,可以將文件命名為 HelloWorld.asmx,然后將它放在虛擬目錄 Bar 中的服務(wù)器 Foo 上。使用幾乎任何兼容 Html 3.2 或更高版本的瀏覽器,都可以輸入 URL http://Foo/Bar/HelloWorld.asmx 來顯示這個(gè) Web Service 的公用方法(標(biāo)有 WebMethod 屬性),以及那些可用來調(diào)用這些方法的協(xié)議,例如 SOAP 或 HTTP GET。假如在 Internet EXPlorer 地址欄中輸入 http://Foo/Bar/HelloWorld.asmx?SDL,基于服務(wù)說明語言 (WSDL) 語法,將產(chǎn)生與 XML 文件相同的信息。這個(gè) WSDL 文件由訪問服務(wù)的客戶使用,并且非常重要。

  訪問 Web Serivces

  除了使開發(fā)人員能夠創(chuàng)建 Web Services 的技術(shù)之外,Microsoft .NET 框架還提供了一套用來“使用”(即以客戶端身份訪問)Web Services 的成熟工具與代碼。因?yàn)?Web Services 基于簡單對象訪問協(xié)議 (SOAP) 和 HTTP 等開放協(xié)議,所以這種客戶端技術(shù)也可以用于使用非 ASP.NET Web Services。

  SDK 中有一種稱為 WebServiceUtil.exe 的工具(在 VS IDE 中使用“Add Web Reference...”選項(xiàng)時(shí)自動生效)。這個(gè)程序可用于下載 Web Service 的 WSDL 說明,然后創(chuàng)建表示這個(gè)服務(wù)的地址的代理類。例如,您可以輸入:

WebServiceUtil /c:PRoxy /pa:http://someDomain.com/someFolder/HelloWorld.asmx?SDL
  然后,系統(tǒng)將創(chuàng)建稱為 HelloWorld.cs 的代理類。

  這個(gè)類與前面創(chuàng)建的類看起來非常相似。它包括稱為 SayHelloWorld 的方法,該方法返回字符串。將這個(gè)代理類編譯到應(yīng)用程序中,然后調(diào)用其方法,結(jié)果是代理類在 HTTP 上打包 SOAP 請求,并接收 SOAP 編碼的回應(yīng),然后封送為一個(gè)字符串。

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

Dim myHelloWorld As New HelloWorld()
Dim sReturn As String = myHelloWorld.SayHelloWorld()
  返回值將是“Hello World”。

  將 SOAP 用作組件開發(fā)工具

  創(chuàng)建分布式應(yīng)用程序時(shí),假如需要高度控制性并要求能夠選擇系統(tǒng)耦合程度,那么可以使用 Microsoft .NET Remoting。

  Microsoft .NET Remoting 還提供了與公共語言運(yùn)行時(shí)的深入集成,并且為開發(fā)人員提供了全面的跨連接類型系統(tǒng)保真性。這包括構(gòu)造函數(shù)、委托、重載方法、通過值和引用傳遞對象、類的層次結(jié)構(gòu)、接口、方法、屬性、字段,以及通過可插入通道、分布式標(biāo)識、激活、租用生存期和 CallContext(獨(dú)立于參數(shù)的 SOAP 頭中的流對象)在連接上的應(yīng)用程序 (Web Services) 之間進(jìn)行 Marshal by Value(制作副本)以及 Marshal by Ref(傳遞 ObjRef)。

  使用 .NET Remoting,開發(fā)人員可以從任何進(jìn)程提供 Remoting 終結(jié)點(diǎn),包括控制臺應(yīng)用、GUI 應(yīng)用、NT Service 和 IIS。在任何使用有效加載編碼(在產(chǎn)品中提供了可插入序列化格式化程序以及 SOAP 和二進(jìn)制格式化程序)通過可插入通道進(jìn)行的任何傳輸過程中都會出現(xiàn)這種情況。SOAP=HTTP+XML,同時(shí)完全支持 HTTP 和 SMTP 上的 SOAP 1.1,這十分令人滿足。

  我們可以獲得 WSDL 支持來說明 Web Service 并保證運(yùn)行時(shí)類型系統(tǒng)的完全保真性。.NET Remoting 提供了 .NET SDK 的 Soapsuds 工具,可以從元數(shù)據(jù)生成受控類和 COM 對象的服務(wù)說明。Soapsuds 工具也使用服務(wù)說明并生成元數(shù)據(jù)和代理。開發(fā)人員可以使用密集偵聽模型,將自己的操作作為應(yīng)用程序入站和出站消息流插入。想更為深入的開發(fā)人員則可以采用使用套接字的二進(jìn)制編碼 TCP 通道。

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


  樣例:SOAP 受控代碼事件

  下列代碼演示如何在兩個(gè)應(yīng)用程序之間引發(fā)受控代碼事件。客戶端有一個(gè)本地對象,注冊為接收遠(yuǎn)程對象的事件通知。客戶端呼叫服務(wù)器對象時(shí),就引發(fā)事件,產(chǎn)生對客戶端本地對象的回叫。

  服務(wù)器端

zap.cs
using System;

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

public string greeting;
}

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

// 定義服務(wù)
public class Waz : MarshalByRefObject
{
// 客戶端將預(yù)定和取消預(yù)定此事件
public event GreetingEvent Greeting;

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

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

// 引發(fā)事件
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));

// 注冊服務(wù)器類型。
// 這也可以在 Remoting 配置文件中完成。
RemotingServices.RegisterWellKnownType(
"Zap", // 程序集
"Zap.Waz", // 完整的類名
"host/Waz.soap", // URI
WellKnownObjectMode.Singleton); // 對象模式

// 完成操作,等候用戶退出
Console.WriteLine("主機(jī)已經(jīng)預(yù)備好處理遠(yuǎn)程消息。");
Console.WriteLine("請按 ENTER 鍵退出");
String keyState = Console.ReadLine();
}
}

客戶端
client.cs

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

using Zap;

// 將對象按引用本地封送到要引發(fā)的事件
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"
);


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

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

// 取消預(yù)定事件: 通過 SOAP 進(jìn)行
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
  在一個(gè)窗口中啟動 host.exe 文件,然后在另一個(gè)窗口中啟動 client.exe 文件。您將會看到事件被引發(fā)回到客戶端。

  這是諸多 .NET Remoting 應(yīng)用程序中的一個(gè)小例子。.NET Remoting 提供了網(wǎng)絡(luò)上的完全 CLR 受控代碼類型系統(tǒng),它還是優(yōu)秀的 SOAP 服務(wù)器和客戶端,因?yàn)樗耆?SOAP 1.1 規(guī)范。
  將 SOAP 用作 ATL 開發(fā)工具


  ATL Server Web Services 為 C++ 開發(fā)人員提供了在本機(jī)代碼中創(chuàng)建和使用 Web Services 的簡便方式。ATL Server 是 C++ 開發(fā)人員在 Internet 上提供和使用 Web Services 的首選方法,其設(shè)計(jì)目的是為包含 SOAP 的 Web 應(yīng)用提供快速、輕便和高度靈活的程序庫。

  ATL Server 之所以稱為 ATL,是因?yàn)樗w現(xiàn)了同時(shí)追求高性能和靈活性的 ATL 目標(biāo)。例如,您可以很輕易地拋開 ATL Server HTTP 模型,編寫您自己的調(diào)度程序,同時(shí)仍然獲得 ATL Server 封送/協(xié)議代碼的好處。

  ATL Server Web Services 使用與 COM 相似的語法說明接口,便于目前的 ATL 開發(fā)人員學(xué)習(xí)。這種與 COM 相似的語法答應(yīng)開發(fā)人員輕而易舉地將對象同時(shí)以 COM 對象和 Web Service 方式提供。

  屬性的引入大大簡化了代碼,使它對于非 ATL 開發(fā)人員也很輕易。ATL Server 具有和其他所有 .NET Web Services 進(jìn)行互操作的能力,這對那些在一個(gè)應(yīng)用程序中使用多種技術(shù)的開發(fā)人員來說十分方便。

  接口:新的 __interface 要害字使開發(fā)人員很輕易創(chuàng)建 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);
};
  這是一個(gè)運(yùn)用 ATL Server 定義 Web Service 接口的例子。通過 C++ 屬性的運(yùn)用,嵌入式 IDL 屬性和新的 __interface 要害字、ATL Server Web Service 接口看起來和新的屬性化的 COM 接口非常相似。這里的 Web Service 接口樣例 IWeb_Service_ExampleService 僅實(shí)現(xiàn)一個(gè)方法 HelloWorld。HelloWorld 用 BSTR 作為輸入并返回 BSTR 作為輸出。

  請求處理程序:請求處理程序是一個(gè) C++ 類,該類通過處理程序映射來提供,并且具有通過替代方法映射來提供的方法。處理程序映射只是文字標(biāo)簽與類名稱的映射,而方法映射是類中文字標(biāo)簽與方法的映射。

[
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 應(yīng)用和 Web Services 非常相似。圖 1 顯示了處理請求的模型:

.NET框架和VS.NET中的SOAP
          圖 1. ATL Server 請求處理模型
  HTTP Request 進(jìn)入 IIS,將請求(基于 URL 及其擴(kuò)展)映射到適當(dāng)?shù)?ISAPI DLL。然后,ISAPI DLL 把在請求中指定的處理程序(即在標(biāo)簽或查詢參數(shù)中指定的處理程序)映射到適當(dāng)?shù)?application DLL。Application DLL 再將這個(gè)處理程序映射到 C++ 對象。在這個(gè)模型(ATL Server 模型)中,Web 應(yīng)用程序和 Web Service 的唯一差別在于最后一步。使用 Web Services,C++ 對象能夠解碼/編碼 SOAP(當(dāng)編譯器解析 soap_handler 屬性時(shí),它會插入執(zhí)行此操作的代碼)。

  您可以理解,這個(gè)類是從我們的接口繼續(xù)過來的,并且我們使用 [soap_method] 屬性指示將由 HelloWorld 方法來處理 SOAP 請求。實(shí)現(xiàn)這種方法和實(shí)現(xiàn)任何其他 C++ 方法是一樣的。

  這個(gè) soap_handler 屬性還確保自動生成有效說明服務(wù)的 WSDL。Web Service 的用戶使用這個(gè)對服務(wù)的說明(格式為 XML/WSDL),確保他們能夠以正確的格式發(fā)送/接收正確的數(shù)據(jù)。

  通過 ATL Server 使用 Web Services

  通過 ATL Server 使用 Web Services 相對來說是個(gè)比較簡單的操作。開發(fā)人員只需使用 “Add Web Reference” 對話框,將它指向 .disco 文件,然后指向 WSDL,這和使用其他類型的 Web 引用一樣。這個(gè)對話框在后臺運(yùn)行在 Web Service 的 WSDL 上的 sproxy.exe 實(shí)用程序(對于非本機(jī)的 .NET Web Services 有另外一個(gè)實(shí)用程序)。

  該操作將創(chuàng)建 Web Service 代理文件,包含要求利用所請求的 Web Service 的全部 C++ 代碼。使用 WSDL 中的信息,代理生成器能夠判定 Web Service 要接收到的數(shù)據(jù)以及它要返回給客戶端的數(shù)據(jù)。這就答應(yīng)代理生成器創(chuàng)建可以和 Web Service“交談”的頭文件。

  您只需創(chuàng)建自己的 Web Service 類(如在生成的頭文件中查找到的一樣)的實(shí)例,并且使用合適的方法即可,例如:


CWeb_Service_ExampleServiceService MyService;
CComBSTR bstrOut;
CComBSTR bstrIn(L"World");
MyService.HelloWorld ( bstrIn ,&bstrOut,);
wprintf(bstrOut);
  現(xiàn)在,您就已經(jīng)有一個(gè)基本的 ATL Server Web Service 和 ATL Server Web Service Consumer 了。

  總結(jié)

  本文的主要目的是對 .NET 框架和 Visual Studio.NET 中的 SOAP 功能作一個(gè)總體的介紹。其次,就如何創(chuàng)建使用 SOAP 的應(yīng)用程序,給用戶一些有益的指導(dǎo)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 海盐县| 大方县| 玉环县| 堆龙德庆县| 吉首市| 西充县| 罗源县| 南郑县| 叙永县| 新平| 连江县| 牡丹江市| 大港区| 厦门市| 汕头市| 苏尼特左旗| 余姚市| 饶阳县| 辽宁省| 德钦县| 梧州市| 逊克县| 尖扎县| 长沙县| 阳曲县| 云南省| 曲阳县| 岳池县| 安达市| 磐石市| 金山区| 红安县| 彭山县| 洪湖市| 手机| 德令哈市| 夏津县| 湘西| 宜黄县| 凉山| 怀柔区|