當(dāng)前位置:工程項目OA系統(tǒng) > 泛普各地 > 重慶OA系統(tǒng) > 重慶OA行業(yè)資訊
Visual Studio .NET中的XML Web services入門
Visual Studio .NET中的XML Web services入門
Rob Caron
Visual Studio Team
Microsoft Corporation
2002 年 2 月
摘要:Microsoft? Visual Studio? .NET 和 XML Web services 提供了一個簡單、靈活且基于標(biāo)準(zhǔn)的模型,開發(fā)人員無論使用何種平臺、編程語言或?qū)ο竽P途梢跃帉懡M合應(yīng)用程序。本文將幫助您快速學(xué)習(xí)使用 Visual Studio .NET 創(chuàng)建并訪問 XML Web services。本文包含一些指向英文站點的鏈接。
簡介
XML Web services 是可以由潛在的異類系統(tǒng)通過 Internet
訪問的可編程單元。XML Web services 在很大程度上依賴于已經(jīng)被廣泛接受的支持互操作的 XML、HTTP 和其他 Internet 標(biāo)準(zhǔn)。
XML Web services 可以由單個應(yīng)用程序在內(nèi)部使用或通過 Internet 對外公開供多個應(yīng)用程序使用。XML Web services 可通過標(biāo)準(zhǔn)接口進行訪問,允許異類的系統(tǒng)以同一種 Web 方式協(xié)同工作。
XML Web services 沒有追隨一般的代碼可移植性功能,而是提供了一個使數(shù)據(jù)和系統(tǒng)能夠協(xié)同工作的可行的解決方案。XML Web services 使用基于 XML 的消息在多個使用不同組件模型、操作系統(tǒng)和編程語言的系統(tǒng)間交換數(shù)據(jù)。采用與通常在分布式應(yīng)用程序中使用組件相同的方法,開發(fā)人員可以創(chuàng)建應(yīng)用程序,將不同來源的 XML Web services 組合在一起。
XML Web services 的一個核心特征是在服務(wù)的實施和使用方面的高度抽象。通過將基于 XML 的消息用作創(chuàng)建和訪問服務(wù)的機制,XML Web services 客戶端和 XML Web services 提供商除了需要了解對方的輸入、輸出和位置以外,不再需要任何其他信息。
XML Web services 將分布式應(yīng)用程序的開發(fā)帶入了新的時代。使用專有結(jié)構(gòu)的緊耦合系統(tǒng)犧牲了應(yīng)用程序的互操作性。XML Web services 將互操作性推到了一個全新的高度。作為新一代 Internet 的革命性進步,XML Web services 將成為鏈接所有計算設(shè)備的基礎(chǔ)結(jié)構(gòu)。
有關(guān)詳細(xì)信息,請參閱 Programming the Web with XML Web services。
用托管代碼編寫的 XML Web services
ASP.NET 頁框架同時也作為采用托管代碼的 XML
Web services 的框架。因此,XML Web services 可以訪問 .NET
框架的許多功能,如身份驗證、緩存和狀態(tài)管理。這樣一來,開發(fā)人員便可以專注于創(chuàng)建或訪問 XML Web services,而無需編寫基礎(chǔ)結(jié)構(gòu)代碼。
在 ASP.NET 應(yīng)用程序模型中,Web 頁專供使用 .aspx 擴展名的瀏覽器使用。為了使 XML Web services 和常規(guī) ASP.NET 頁區(qū)分開來,XML Web services 使用 .asmx 擴展名。
XML Web services 由 XML Web services 入口點和實現(xiàn) XML Web services 功能的代碼組成。在 ASP.NET 中,.asmx 文件充當(dāng) XML Web services 的可尋址入口點。它引用預(yù)編譯程序集中的代碼、文件的支持代碼或 .asmx 文件本身包含的代碼。
使用 XML Web services 時,有兩種基本的操作:
創(chuàng)建 XML Web services - 創(chuàng)建 XML Web services 時,實際上是在創(chuàng)建一個將功能向 XML Web services
客戶端公開的應(yīng)用程序。
訪問 XML Web services - 訪問 XML Web services 時,客戶端應(yīng)用程序?qū)⒉檎摇⒁貌⑹褂?
XML Web services 中包含的功能。
XML Web services 可以是獨立的應(yīng)用程序或大型 Web
應(yīng)用程序的子組件。最低要求是客戶端必須能夠向 XML Web services 發(fā)送消息。
有關(guān)詳細(xì)信息,請參閱 XML Web services in Managed Code。
使用 Visual Studio 創(chuàng)建 XML Web services
要使用 Visual
Studio 創(chuàng)建采用托管代碼的 XML Web services,需要訪問為開發(fā) ASP.NET 應(yīng)用程序(該應(yīng)用程序?qū)⒃?Web 項目的環(huán)境中創(chuàng)建)而配置的
Web 服務(wù)器。Web 項目的種類很多,當(dāng)您要在 Visual Studio .NET 中使用采用托管代碼的 XML Web services 時,可以使用
ASP.NET Web Service 項目模板。在 Visual Studio 中創(chuàng)建 XML Web services 項目后,就會看到 Component
Designer(組件設(shè)計器)。組件設(shè)計器是 XML Web services 的設(shè)計界面。可以使用 Design(設(shè)計)視圖向 XML Web
services 添加組件,并使用 Code(代碼)視圖查看或編輯與 XML Web services 關(guān)聯(lián)的代碼。
在 Visual Studio 中創(chuàng)建 ASP.NET Web Service 項目后,它將在 Web 服務(wù)器上構(gòu)造一個 Web 應(yīng)用程序項目結(jié)構(gòu),同時在您的本地計算機上構(gòu)造一個 Visual Studio 解決方案文件。解決方案文件 (.sln) 包含配置和生成設(shè)置,并且保存著一系列與項目關(guān)聯(lián)的文件。此外,Visual Studio 將自動創(chuàng)建支持 XML Web services 所必需的文件和引用。完成后,Visual Studio 集成開發(fā)環(huán)境 (IDE) 將在 Design(設(shè)計)視圖中顯示 .asmx 文件。
默認(rèn)情況下,當(dāng)您使用 ASP.NET Web Service 項目模板創(chuàng)建 XML Web services 時,Visual Studio 將使用“支持代碼文件”(如 Service1.asmx.vb 或 Service1.asmx.cs)。支持代碼文件包含實現(xiàn) XML Web services 功能的代碼。默認(rèn)情況下,Solution Explorer(解決方案資源管理器)會隱藏支持代碼文件。當(dāng)查看 .asmx 文件的 Code(代碼)視圖時,實際上您是在查看支持代碼文件的內(nèi)容。.asmx 文件本身包含處理指令 WebService,它指示在何處可以找到 XML Web services 的實現(xiàn)方案。生成采用托管代碼的 XML Web services 后,ASP.NET 將自動提供基礎(chǔ)結(jié)構(gòu)并處理 XML Web services 的請求和響應(yīng),包括分析和創(chuàng)建簡單對象訪問協(xié)議 (SOAP) 消息。編譯的輸出是一個 .dll 文件,該文件位于項目的 bin 文件夾中。
有關(guān)詳細(xì)信息,請參閱 Creating XML Web services in Managed Code。
WebService 處理指令
WebService 處理指令為 ASP.NET
環(huán)境提供了必要的信息,如實現(xiàn) XML Web services 功能的類。以下是 .asmx 文件中 WebService 處理指令的示例:
' Visual Basic
<%@ WebService Language="vb"
Codebehind="Service1.asmx.vb"
Class="WebService1.Service1"
%>
// C#
<%@ WebService Language="c#"
Codebehind="Service1.asmx.cs"
Class="WebService1.Service1"
%>
注意:要在 Solution Explorer(解決方案資源管理器)中查看 .asmx 文件的內(nèi)容,請用右鍵單擊 .asmx
文件,然后單擊快捷菜單中的 Open With(打開方式)。在 Open With(打開方式)對話框中,選擇 Source Code (Text)
Editor(源代碼 [文本] 編輯器),然后單擊 Open(打開)。
Language 屬性指示開發(fā) XML Web services
所使用的編程語言??梢允褂萌魏闻c .NET 兼容的語言(如 Visual Basic .NET 或 Visual C#)來創(chuàng)建 XML Web
services。與 .asmx 頁關(guān)聯(lián)的支持代碼文件由 Codebehind 屬性來指示。Class 屬性指示支持代碼文件中用來實現(xiàn) XML Web
services 功能的類。
有關(guān)詳細(xì)信息,請參閱 Code Model for XML Web services in Managed Code。
System.Web.Services.WebService
類
System.Web.Services.WebService 類定義了 XML Web services
的可選基類,并提供了直接訪問常見 ASP.NET 對象(如應(yīng)用程序和會話狀態(tài)的對象)的權(quán)限。默認(rèn)情況下,使用 Visual Studio 以托管代碼的形式創(chuàng)建的
XML Web services 繼承此類。XML Web services 可以繼承此類以獲得訪問 ASP.NET 固有對象(如 Request 和
Session)的權(quán)限。
如果 XML Web services 沒有繼承此類,也可以從 System.Web.HttpContext.Current 訪問 ASP.NET 固有對象。實現(xiàn) XML Web services 的類必須是公共的,并且必須有一個公共的默認(rèn)構(gòu)造函數(shù)(不帶參數(shù)的構(gòu)造函數(shù))。這樣,ASP.NET 就能夠創(chuàng)建 XML Web services 類的實例以處理傳入的 XML Web services 請求。
有關(guān)詳細(xì)信息,請參閱 Inheriting from the WebService Class。
WebService 屬性
每個 XML Web services
都需要唯一的命名空間,它可使客戶端應(yīng)用程序區(qū)分出可能使用相同方法名稱的 XML Web services。在 Visual Studio .NET 中創(chuàng)建的
XML Web services 的默認(rèn)命名空間是“http://tempuri.org/”。盡管命名空間類似于典型的 URL,但在 Web
瀏覽器中是不能查看的,它只是一個唯一標(biāo)識符。
注意:您可能希望在包含有關(guān)您所提供的 XML Web services 信息的位置提供一個 Web 頁。
WebService
屬性提供以下屬性:
Description - 此屬性的值包含描述性消息,此消息將在 XML Web services 的說明文件(例如服務(wù)說明和服務(wù)幫助頁)生成后顯示給
XML Web services 的潛在用戶。
Name - 此屬性的值包含 XML Web services 的名稱。默認(rèn)情況下,該值是實現(xiàn)
XML Web services 的類的名稱。Name 屬性標(biāo)識 XML Web services 的 XML 限定名稱的本地部分。Name
屬性也用于在服務(wù)幫助頁上顯示 XML Web services 的名稱。
Namespace - 此屬性的值包含 XML Web
services 的默認(rèn)命名空間。XML 命名空間提供了一種在 XML 文檔中創(chuàng)建名稱的方法,該名稱可由統(tǒng)一資源標(biāo)識符 (URI) 標(biāo)識。使用 XML
命名空間,可以唯一標(biāo)識 XML 文檔中的元素或?qū)傩?。因而,?XML Web services 的服務(wù)說明中,Namespace 被用作與 XML Web
services 直接相關(guān)的 XML 元素的默認(rèn)命名空間。如果不指定命名空間,就使用默認(rèn)命名空間 http://tempuri.org/。
以下示例代碼說明了 WebService
屬性的用法:
' Visual Basic
<WebService(Namespace:="http://MyServer/MyWebServices/",
_
Description:="此處可以放一些描述性文字。",
Name:="MyFavoritesService")> _
Public Class Service1
Inherits System.Web.Services.WebService
' 實現(xiàn)代碼。
End
Class
// C#
[WebService(Namespace="http://MyServer/MyWebServices/",
Description="此處可以放一些描述性文字。",
Name="MyFavoritesService")]
public class Service1 :
System.Web.Services.WebService
{
//
實現(xiàn)代碼。
}
有關(guān)詳細(xì)信息,請參閱 Using the WebService Attribute。
WebMethod 屬性
以托管代碼創(chuàng)建 XML Web services 時,通過在 Public
方法聲明之前放置 WebMethod 屬性可以指定在 XML Web services 中可用的方法。Private 方法不能充當(dāng) XML Web
services 的入口點,盡管它們可以采用相同的類并且 XML Web services 代碼可以調(diào)用它們。WebMethod 屬性必須應(yīng)用到可用作 XML
Web services 一部分的每種公共方法中。
WebMethod 屬性包含配置 XML Web services 行為的幾個屬性。例如,可以使用此屬性在相關(guān)服務(wù)幫助頁提供一個簡短說明。
WebMethod 屬性提供以下屬性:
BufferResponse - 當(dāng)設(shè)置為 True(默認(rèn)設(shè)置)時,ASP.NET
將響應(yīng)向下發(fā)送到客戶端之前先緩存整個響應(yīng)。緩存是一種非常有效的方法,可以通過減少輔助進程和 Internet 信息服務(wù) (IIS)
進程之間的通信來提高性能。當(dāng)設(shè)置為 False 時,ASP.NET 會將響應(yīng)緩存在 16 KB
的區(qū)塊中。通常,只有在不想一次將響應(yīng)的全部內(nèi)容都緩存在內(nèi)存中時,才將此屬性設(shè)置為 False。例如,正在寫回一個將項流出數(shù)據(jù)庫的集合。除非另行指定,否則默認(rèn)值為
True。
CacheDuration - 此屬性的值指定 ASP.NET 緩存每個唯一參數(shù)設(shè)置結(jié)果所需的秒數(shù)。除非另行指定,否則默認(rèn)值為
0,此設(shè)置將禁用結(jié)果緩存。
Description - 此屬性的值提供了對 XML Web services
方法的說明,顯示于服務(wù)幫助頁中。除非另行指定,否則默認(rèn)值為空字符串。
EnableSession - 當(dāng)設(shè)置為
False(默認(rèn)設(shè)置)時,ASP.NET 將無法訪問 XML Web services 方法的會話狀態(tài)。當(dāng)設(shè)置為 True 時,XML Web services
可以直接從 HttpContext.Current.Session 訪問會話狀態(tài)集合;在繼承了 WebService 基類的情況下,也可以使用
WebService.Session 屬性進行訪問。
MessageName - 此屬性的值使 XML Web services
能夠使用別名來唯一標(biāo)識重載的方法。除非另行指定,否則默認(rèn)值為方法名。當(dāng)為 MessageName 指定值后,結(jié)果 SOAP
消息會反映出此名稱而不是實際的方法名。
TransactionOption - 此屬性的值指定 XML Web services
方法是否可以作為事務(wù)的根對象。雖然可以將 TransactionOption 屬性設(shè)置為 TransactionOption 枚舉類型的任意值,但是 XML
Web services 方法僅有兩種可能行為:它不參與事務(wù)(Disabled、NotSupported 和
Supported),或是創(chuàng)建新事務(wù)(Required 和 RequiresNew)。除非另行指定,否則默認(rèn)值為
TransactionOption.Disabled。要使用此屬性,需要向 System.EnterpriseServices.dll
添加一個引用。此命名空間包含的方法和屬性,提供了可在 COM+
服務(wù)中找到的分布式事務(wù)模型。
System.EnterpriseServices.ContextUtil 類允許您使用 SetAbort 或
SetComplete 方法設(shè)置該事務(wù)。
以下示例代碼說明了 WebMethod 屬性的用法:
' Visual Basic
Public Class Service1
Inherits
System.Web.Services.WebService
<WebMethod(BufferResponse:=False,
_
CacheDuration:=60,
_
Description:="一些描述性的文字",
MessageName:="RetrieveData")> _
Public Function
GetBigChunkOfData() As DataSet
'
實現(xiàn)代碼
End Function
End Class
// C#
public class Service1 : System.Web.Services.WebService
{
[WebMethod(BufferResponse=false,
CacheDuration=60,
Description="一些描述性的文字",
MessageName="RetrieveData")]
public DataSet
GetBigChunkOfData()
{
//
實現(xiàn)代碼
}
}
有關(guān)詳細(xì)信息,請參閱 Using the WebMethod
Attribute。
使用 Visual Studio 部署 XML Web services
當(dāng)使用 Visual
Studio .NET 創(chuàng)建采用了托管代碼的 XML Web services 時,應(yīng)使用標(biāo)準(zhǔn)部署模型:編譯項目,然后將結(jié)果文件部署到生產(chǎn)服務(wù)器。項目 .dll
文件包含 XML Web services 代碼類文件(.asmx.vb 或 .asmx.cs)以及項目中的所有其他類文件,但不包含 .asmx
文件本身。然后,您可以將這一個項目 .dll 文件部署到生產(chǎn)服務(wù)器中,而無需附帶任何源代碼。當(dāng) XML Web services 接收到請求時,項目 .dll
文件將被加載并執(zhí)行。
圖 1:部署 XML Web services
要將 XML Web services 部署到非開發(fā)服務(wù)器,可以添加 Web 安裝項目,也可以將所需的文件復(fù)制到目標(biāo)服務(wù)器。要使您的 XML Web services 可供其他人使用,需要將其部署到可供目標(biāo)客戶端訪問的 Web 服務(wù)器。
有關(guān)詳細(xì)信息,請參閱 Deploying XML Web services in Managed Code。
服務(wù)幫助頁
從 Web 瀏覽器調(diào)用 .asmx 文件,而不提供已識別的查詢字符串時,.asmx 文件將為
XML Web services 返回一個自動生成的服務(wù)幫助頁。
例如,要訪問名為 Service1.asmx(本地計算機中 WebService1 項目的一部分)的 XML Web services 的服務(wù)幫助頁,可使用以下 URL:
http://localhost/WebService1/Service1.asmx
此服務(wù)幫助頁提供了
XML Web services 提供的以及您可以通過編程訪問的方法的列表。每種方法都含有一個指向其詳細(xì)信息的鏈接。另外,此幫助頁還包括指向 XML Web
services 說明文檔的鏈接。
圖 2:服務(wù)幫助頁
服務(wù)幫助頁的文件名在配置文件的 <wsdlHelpGenerator> XML 元素(默認(rèn)設(shè)置為 DefaultWsdlHelpGenerator.aspx)中指定。默認(rèn)情況下,此特定 ASP.NET Web 窗體是該計算機中所有 XML Web services 所通用的:
%WINDOWS%
Microsoft.NET
Framework
[version]
CONFIG
DefaultWsdlHelpGenerator.aspx
由于服務(wù)幫助頁只是一個 ASP.NET Web
窗體,因而可以對其進行替換或修改以包含其他項目(如公司徽標(biāo))。另外,也可以修改相關(guān) Web .config 文件的
<wsdlHelpGenerator> 元素以指定自定義服務(wù)幫助頁。
有關(guān)詳細(xì)信息,請參閱 Configuration Options for XML Web services Created Using ASP.NET。
服務(wù)方法幫助頁
服務(wù)方法幫助頁提供了與特定 XML Web services
方法相關(guān)的詳細(xì)信息。本頁允許您調(diào)用使用 HTTP-POST 協(xié)議的方法。但是,隨后卻無法調(diào)用要求復(fù)雜輸入?yún)?shù)(如 DataSet)類型的方法。另外,XML
Web services 方法必須支持 HTTP-POST 協(xié)議才能啟用此功能。在服務(wù)方法幫助頁的底部還提供了協(xié)議(XML Web services
方法所支持的)的請求和響應(yīng)消息示例。
圖 3:服務(wù)方法幫助頁
例如,要訪問 Service1.asmx(本地計算機中 WebService1 項目的一部分)中名為 MyWebMethod 的 XML Web services 方法,可使用以下 URL:
http://localhost/WebService1/Service1.asmx?op=MyWebMethod
有關(guān)詳細(xì)信息,請參閱
Exploring XML Web services Content。
Web Service 說明 (.wsdl)
服務(wù)幫助頁還提供了指向 XML Web services
服務(wù)說明的鏈接,服務(wù)說明是 XML Web services 功能的正式定義。服務(wù)說明是使用 Web Service 說明語言 (WSDL)
語法的文檔。服務(wù)說明定義了與 XML Web services 交換信息時,客戶端需要遵循的消息格式合約。
Web Service 說明示例
<?xml version="1.0" encoding="utf-8"?>
<definitions
xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:s="http://www.w3.org/2001/XMLSchema"
xmlns:s0="http://Walkthrough/XmlWebServices/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/"
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
targetNamespace="http://Walkthrough/XmlWebServices/"
xmlns="http://schemas.xmlsoap.org/wsdl/">
<types>
<s:schema elementFormDefault="qualified"
targetNamespace="http://Walkthrough/XmlWebServices/">
<s:element
name="ConvertTemperature">
<s:complexType>
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="dFahrenheit"
type="s:double"
/>
</s:sequence>
</s:complexType>
</s:element>
<s:element
name="ConvertTemperatureResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="1" maxOccurs="1"
name="ConvertTemperatureResult"
type="s:double" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="double"
type="s:double" />
</s:schema>
</types>
<message
name="ConvertTemperatureSoapIn">
<part
name="parameters" element="s0:ConvertTemperature" />
</message>
<message
name="ConvertTemperatureSoapOut">
<part
name="parameters" element="s0:ConvertTemperatureResponse" />
</message>
<message
name="ConvertTemperatureHttpGetIn">
<part
name="dFahrenheit" type="s:string" />
</message>
<message name="ConvertTemperatureHttpGetOut">
<part name="Body" element="s0:double" />
</message>
<message
name="ConvertTemperatureHttpPostIn">
<part
name="dFahrenheit" type="s:string" />
</message>
<message name="ConvertTemperatureHttpPostOut">
<part name="Body" element="s0:double" />
</message>
<portType
name="Service1Soap">
<operation
name="ConvertTemperature">
<documentation>此方法可以將華氏溫度轉(zhuǎn)換為攝氏溫度。</documentation>
<input message="s0:ConvertTemperatureSoapIn"
/>
<output
message="s0:ConvertTemperatureSoapOut" />
</operation>
</portType>
<portType
name="Service1HttpGet">
<operation
name="ConvertTemperature">
<documentation>此方法可以將華氏溫度轉(zhuǎn)換為攝氏溫度。</documentation>
<input message="s0:ConvertTemperatureHttpGetIn"
/>
<output
message="s0:ConvertTemperatureHttpGetOut" />
</operation>
</portType>
<portType
name="Service1HttpPost">
<operation
name="ConvertTemperature">
<documentation>此方法可以將華氏溫度轉(zhuǎn)換為攝氏溫度。</documentation>
<input message="s0:ConvertTemperatureHttpPostIn"
/>
<output
message="s0:ConvertTemperatureHttpPostOut" />
</operation>
</portType>
<binding
name="Service1Soap" type="s0:Service1Soap">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http"
style="document" />
<operation
name="ConvertTemperature">
<soap:operation
soapAction="http://Walkthrough/XmlWebServices/ConvertTemperature"
style="document" />
<input>
<soap:body
use="literal" />
</input>
<output>
<soap:body
use="literal" />
</output>
</operation>
</binding>
<binding name="Service1HttpGet"
type="s0:Service1HttpGet">
<http:binding verb="GET"
/>
<operation
name="ConvertTemperature">
<http:operation location="/ConvertTemperature"
/>
<input>
<http:urlEncoded
/>
</input>
<output>
<mime:mimeXml
part="Body" />
</output>
</operation>
</binding>
<binding name="Service1HttpPost"
type="s0:Service1HttpPost">
<http:binding
verb="POST" />
<operation
name="ConvertTemperature">
<http:operation location="/ConvertTemperature"
/>
<input>
<mime:content
type="application/x-www-form-urlencoded" />
</input>
<output>
<mime:mimeXml
part="Body" />
</output>
</operation>
</binding>
<service name="Service1">
<documentation>一種溫度轉(zhuǎn)換服務(wù)。</documentation>
<port name="Service1Soap"
binding="s0:Service1Soap">
<soap:address
location="http://localhost/TempConvert2/Service1.asmx"
/>
</port>
<port
name="Service1HttpGet"
binding="s0:Service1HttpGet">
<http:address
location="http://localhost/TempConvert2/Service1.asmx"
/>
</port>
<port
name="Service1HttpPost"
binding="s0:Service1HttpPost">
<http:address
location="http://localhost/TempConvert2/Service1.asmx"
/>
</port>
</service>
</definitions>
要訪問名為 Service1.asmx(本地計算機上
TempConvert2 項目的一部分)的 XML Web services 的服務(wù)說明(如上例所示),可使用以下 URL:
http://localhost/TempConvert2/Service1.asmx?WSDL
有關(guān)詳細(xì)信息,請參閱
Web Services Description Language (WSDL) Explained。
XML Web services 發(fā)現(xiàn)
XML Web services 發(fā)現(xiàn)是對 XML Web
services 說明進行定位和詢問的過程,是訪問 XML Web services 的基本步驟。通過發(fā)現(xiàn)進程,XML Web services
客戶端能夠在設(shè)計階段了解某個 XML Web services 是否存在,它的功能如何,以及如何正確與它進行交互操作。
然而,實現(xiàn) XML Web services 的 Web 站點不需要支持該發(fā)現(xiàn)進程,而是由另一個站點負(fù)責(zé)說明服務(wù)(如 XML Web services 目錄)。另外,可能沒有一個公開的方法可用來查找服務(wù),例如在創(chuàng)建專用服務(wù)時。
有關(guān)詳細(xì)信息,請參閱 XML Web services Discovery。
靜態(tài)發(fā)現(xiàn) (.disco)
可以通過發(fā)布 .disco 文件(一個 XML
文檔,包含指向其他發(fā)現(xiàn)文檔、XSD 方案和服務(wù)說明的鏈接)來啟用 XML Web services 的程序發(fā)現(xiàn)。使用 ASP.NET 自動創(chuàng)建的 XML Web
services 能夠提供生成的發(fā)現(xiàn)文檔。例如,要訪問名為 Service1.asmx(本地計算機中 WebService1 項目的一部分)的 XML Web
services 發(fā)現(xiàn)文檔,可使用以下 URL:
http://localhost/WebService1/Service1.asmx?DISCO
以下示例顯示了發(fā)現(xiàn)文檔的結(jié)構(gòu):
<?xml version="1.0" ?>
<disco:discovery xmlns:disco="http://schemas.xmlsoap.org/disco"
xmlns:wsdl="http://schemas.xmlsoap.org/disco/wsdl">
<wsdl:contractRef ref="http://MyWebServer/UserName.asmx?WSDL"/>
</disco:discovery>
注意:發(fā)現(xiàn)文檔是一個元素容器,通常包含提供
XML Web services 發(fā)現(xiàn)信息的資源鏈接 (URL)。如果 URL 是相對的,則假定它們是相對于發(fā)現(xiàn)文檔的位置。
有關(guān)詳細(xì)信息,請參閱
Fine-Tuning Discovery Mechanisms。
動態(tài)發(fā)現(xiàn) (.vsdisco)
動態(tài)發(fā)現(xiàn)是 ASP.NET 通過開發(fā) Web
服務(wù)器上的文件夾層次結(jié)構(gòu)執(zhí)行迭代搜索以查找可用的 XML Web services 的過程。動態(tài)發(fā)現(xiàn) (.vsdisco) 文件是基于 XML
的文件,可以包含零或多個 <exclude> 節(jié)點。每個 <exclude> 節(jié)點包含一個“path”屬性,path
屬性包含指向子文件夾(動態(tài)發(fā)現(xiàn)進程不應(yīng)搜索的子文件夾)的相對路徑。以下是 .vsdisco 示例文件:
<?xml version="1.0" encoding="utf-8" ?>
<dynamicDiscovery
xmlns="urn:schemas-dynamicdiscovery:disco.2000-03-17">
<exclude path="_vti_cnf" />
<exclude
path="_vti_pvt" />
<exclude path="_vti_log"
/>
<exclude path="_vti_script"
/>
<exclude path="_vti_txt"
/>
<exclude path="Web References"
/>
</dynamicDiscovery>
當(dāng)從啟用了動態(tài)發(fā)現(xiàn)的 Web 服務(wù)器請求 .vsdisco
文件時,對于已通過動態(tài)發(fā)現(xiàn)進程進行定位的每個 Web Service,都會返回一個包含 Web Service 發(fā)現(xiàn)信息的發(fā)現(xiàn)文檔。
默認(rèn)情況下,web.config 中禁用了動態(tài)發(fā)現(xiàn)。要積極控制哪些 XML Web services 客戶端可以發(fā)現(xiàn)服務(wù),應(yīng)該在開發(fā) Web 服務(wù)器上只使用動態(tài)發(fā)現(xiàn)。當(dāng)向生產(chǎn) Web 服務(wù)器部署 XML Web services 時,應(yīng)為那些希望客戶端能夠發(fā)現(xiàn)的 XML Web services 創(chuàng)建并發(fā)布一個靜態(tài)發(fā)現(xiàn)文件 (.disco)。
有關(guān)詳細(xì)信息,請參閱 Deploying XML Web services in Managed Code。
Web Service 目錄
部署完 XML Web services
后,如果希望其他人使用,需要考慮如何讓開發(fā)人員找到它。使 XML Web services 可以為多數(shù)人使用的一種既定方法是,將其注冊到 XML Web
services 目錄中。通用說明、發(fā)現(xiàn)和集成 (UDDI) 項目提供了一份公司及其提供的服務(wù)的目錄。
有關(guān)詳細(xì)信息,請參閱 XML Web services Directories。
使用 Visual Studio 訪問 XML Web services
XML Web services
客戶端是指任何引用和使用 XML Web services 的組件或應(yīng)用程序。它不必是基于客戶端的應(yīng)用程序,事實上,在大多數(shù)情況下,您的 XML Web
services 客戶端可能是其他 Web 應(yīng)用程序(如 Web 窗體或其他 XML Web services)。當(dāng)訪問采用托管代碼的 XML Web
services 時,代理類和 .NET 框架將處理所有結(jié)構(gòu)代碼。
從托管代碼訪問 XML Web services 是一個簡單的過程。首先,向希望訪問的 XML Web services 項目添加一個 Web 引用。Web 引用使用作為代理的方法為每個公開的 XML Web services 方法創(chuàng)建代理類。其次,添加 Web 引用的命名空間。最后,創(chuàng)建代理類實例并像訪問其他類的方法一樣訪問該類方法。
有關(guān)詳細(xì)信息,請參閱 Accessing XML Web services in Managed Code。
查找 XML Web services 并添加 Web 引用
有時,您可能既是 XML Web
services 的提供者,又是 XML Web services 的使用者。在這種情況下,您可能知道 XML Web services
的位置和功能。但在其他時候,您可能是訪問由別人提供的 XML Web services。在這種情況下,您或許不知道 XML Web services
是否滿足您的要求。
為了簡化代碼模型,用托管代碼編寫的應(yīng)用程序使用一個 Web 引用來代表各本地 XML Web services。通過使用 Add Web Reference(添加 Web 引用)對話框向您的項目添加 Web 引用。此對話框使您可以瀏覽您的本地服務(wù)器、Microsoft UDDI 目錄和 Internet 上的 XML Web services。
Add Web Reference(添加 Web 引用)對話框使用 XML Web services 發(fā)現(xiàn)進程,在從對話框中瀏覽的 Web 站點上,查找合適的 XML Web services。對于給定的地址,它使用為查找 XML Web services 發(fā)現(xiàn) (DISCO) 文檔并最終找到 XML Web 說明文檔(遵守 Web Service 說明語言 [WSDL] 的語法)而設(shè)計的算法來詢問 Web 站點。
當(dāng)使用 Add Web Reference(添加 Web 引用)對話框查找到應(yīng)用程序訪問的 XML Web services 后,單擊 Add Reference(添加引用)按鈕告訴 Visual Studio 將服務(wù)說明的一份副本下載到本地計算機,然后生成訪問所選 XML Web services 的代理類。代理類包含了一些方法,可以同步或異步調(diào)用公開的 XML Web services 方法。
有關(guān)詳細(xì)信息,請參閱 Locating XML Web services。
動態(tài)和靜態(tài) URL
Web 引用可以使用靜態(tài) URL,也可以使用動態(tài) URL。Web 引用的 Web
Reference URL 屬性用于指定引用的 XML Web services 的 URL。默認(rèn)情況下,此屬性被設(shè)置為所選 XML Web services
的 URL(是一個靜態(tài) URL)。
如果將 URL Behavior 屬性設(shè)置保留為默認(rèn)值 Static,則當(dāng)創(chuàng)建類實例時,會使用硬編碼的 URL 來設(shè)置該代理類的 URL 屬性。
如果將 Web 引用的 URL Behavior 屬性設(shè)置為 Dynamic,則應(yīng)用程序在運行時將從您的應(yīng)用程序配置文件的 <appSettings> 部分獲得 URL,例如:
<appSettings>
<add
key="myApplication.myServer.Service1"
value="http://myServer/myXmlWebService/Service1.asmx"/>
</appSettings>
當(dāng)您創(chuàng)建代理對象的實例時,您也可以通過編程來為應(yīng)用程序的對象設(shè)置
URL 屬性。不管代理使用何種 URL,它必須是符合 WSDL 的 XML Web services;當(dāng)添加 Web 引用時,應(yīng)與已使用的 XML Web
services 相匹配。否則,早期生成的代理類將不能與之交互。
添加 Web 引用時,您也可以使用 Visual Studio 所使用的同一工具(XML Web services 說明語言工具)生成代理類來創(chuàng)建代理類。當(dāng)您不能從安裝 Visual Studio 的計算機上訪問 XML Web services 時,該方法是很有用的。例如,當(dāng) XML Web services 所在的網(wǎng)絡(luò)直到運行時仍不能被客戶端訪問時。然后,您要手動向應(yīng)用程序項目添加工具生成的文件。
有關(guān)詳細(xì)信息,請參閱 Managing Project Web References。
使用代理類
生成的代理類有自己的命名空間,在創(chuàng)建代理類實例前,您必須向客戶端應(yīng)用程序添加命名空間。對于其他類來說,在調(diào)用方法之前,您必須首先創(chuàng)建它的實例。此過程與創(chuàng)建其他類實例沒有區(qū)別。
當(dāng)使用 Visual Studio 直接從 XML Web services 的服務(wù)說明中生成的代理類時,訪問采用托管代碼的 XML Web services 比較簡單。要訪問 XML Web services 方法,您的客戶端應(yīng)用程序應(yīng)調(diào)用相應(yīng)的代理對象同步方法或異步方法。這些方法執(zhí)行必要的工作,來遠程調(diào)用需要的 XML Web services 方法。默認(rèn)情況下,代理類使用 SOAP 來訪問 XML Web services 方法,因為 SOAP 對三種支持的協(xié)議操作(HTTP-GET、HTTP-POST 和 HTTP-SOAP)支持最豐富的數(shù)據(jù)類型。
通過 Add Web Reference(添加 Web 引用)進程生成的代理類來自 System.Web.Service.Protocols.SoapHttpClientProtocol 類,它包含的幾個屬性可用來控制該類訪問 XML Web services 的行為。
除此以外,SoapHttpClientProtocol 類還提供了以下屬性:
ClientCertificates - 此屬性允許客戶端在調(diào)用 XML Web services 方法時傳遞一個或多個客戶端證書(也叫做
Authenticode X.509 v.3 證書)。
CookieContainer - 如果 XML Web services
方法使用會話狀態(tài),那么在響應(yīng)標(biāo)題中會向 XML Web services 客戶端(用來唯一標(biāo)識 XML Web services 客戶端的會話)傳回一個
cookie。對于收到該 cookie 的 XML Web services 客戶端,必須創(chuàng)建一個 CookieContainer 的新實例并在調(diào)用 XML
Web services 方法之前將其屬性指定為 CookieContainer。這就可以確保 cookie 能夠正確地包含在后續(xù)請求中。
Credentials - 當(dāng)使用 Credentials 屬性時,XML Web services 客戶端必須實例化實現(xiàn)
ICredentials 的類(如 NetworkCredential),然后設(shè)置專用于驗證機制的客戶憑證。NetworkCredential
類可以用來設(shè)置使用基本、摘要式、NTLM 和 Kerberos 身份驗證機制的驗證憑證。
PreAuthenticate - 當(dāng)
PreAuthenticate 為 True 時,如果驗證機制支持該設(shè)置,WWW 驗證標(biāo)題將隨第一個請求發(fā)送。當(dāng) PreAuthenticate 為
False(默認(rèn)值)時,無需先進行用戶身份驗證,就可以向 XML Web services 方法發(fā)送請求。如果知道 Web Service
需要驗證,就可以通過將屬性設(shè)置為 True 來節(jié)省一次往返操作。
Proxy -
如果客戶端需要使用不同于在系統(tǒng)設(shè)置中所發(fā)現(xiàn)的代理設(shè)置,需要使用此屬性。可以使用 WebProxy 類來設(shè)置代理設(shè)置,因為它可以實現(xiàn)
IWebProxy。否則,默認(rèn)代理設(shè)置可能將在配置文件中進行設(shè)置。
Timeout - 超時(毫秒)用于同步調(diào)用 XML Web
services。默認(rèn)值是 100000 毫秒。將 Timeout 屬性值設(shè)置為 Timeout.Infinite,表示請求沒有超時。但是,Web
服務(wù)器仍然有可能引起請求在服務(wù)器端超時。
Url - 此屬性的默認(rèn)值由生成代理類的服務(wù)說明中所發(fā)現(xiàn)的 location 屬性確定。
有關(guān)詳細(xì)信息,請參閱 SoapHttpClientProtocol Class。
調(diào)用 XML Web services 方法
向 XML Web services 添加 Web
引用后,您可以調(diào)用 XML Web services 的公開方法并像訪問其他組件方法一樣來訪問結(jié)果。
在以下的示例代碼中,客戶端應(yīng)用程序 (Application1) 訪問一個具有 Web 引用 (Converter) 的 XML Web services,該 Web 引用包含代理類 Service1,而代理類又有一個調(diào)用 XML Web services 的方法 ConvertTemperature。代碼中的粗體行是訪問 XML Web services 所必需的。
' Visual Basic
Imports System
Module Module1
Sub
Main()
Dim cService As New
Converter.Service1()
Dim
dFahrenheit As Double
Dim dCelsius
As Double
Console.Write("華氏度:")
dFahrenheit
=
Convert.ToDouble(Console.ReadLine())
dCelsius =
cService.ConvertTemperature(dFahrenheit)
Console.Write("攝氏度:")
Console.WriteLine(dCelsius.ToString())
End Sub
End
Module
// C#
using System;
namespace Application1
{
class
Class1
{
static void
Main()
{
Converter.Service1
cService = new
Converter.Service1();
Console.WriteLine("華氏度:");
double dFahrenheit =
Convert.ToDouble(Console.ReadLine());
double dCelsius =
cService.ConvertTemperature(dFahrenheit);
Console.Write("攝氏度:");
Console.WriteLine(dCelsius.ToString());
}
}
}
有關(guān)詳細(xì)信息,請參閱 Accessing an XML Web services in Managed
Code。
總結(jié)
XML Web services 提供了在松耦合環(huán)境中使用標(biāo)準(zhǔn)協(xié)議(HTTP、XML、SOAP 和
WSDL)交換消息的能力。消息可以是結(jié)構(gòu)化的、帶類型的,也可以是松散定義的。由于 XML Web services 的基礎(chǔ)是標(biāo)準(zhǔn)協(xié)議,因此您的 XML Web
services 應(yīng)用程序能夠與很多實現(xiàn)、平臺和設(shè)備進行通信。
可以使用 ASP.NET 頁框架創(chuàng)建 XML Web services,并使這些 XML Web services 能夠訪問 .NET 框架的許多功能。由于 ASP.NET 和 .NET 框架是采用托管代碼的 XML Web services 的基礎(chǔ),開發(fā)人員可以專注于創(chuàng)建或訪問 XML Web services,而不需要編寫基礎(chǔ)結(jié)構(gòu)代碼。
當(dāng)您使用 Visual Studio 直接從 XML Web services 的服務(wù)說明中生成的代理類時,訪問采用托管代碼的 XML Web services 比較簡單。代理類代碼將方法調(diào)用轉(zhuǎn)換為請求消息,并將響應(yīng)信息返回給方法的返回值。
- 1如何在烏“云”中達成有效的SOA治理
- 2IT監(jiān)控工作如何引入熱門的ITIL?
- 3網(wǎng)上審批成“雞肋”有何良方對癥下藥
- 4醫(yī)院信息化:簡單即快樂
- 5安全網(wǎng)銀成為銀行新動力
- 6IT治理的利器之一:COBIT(下)
- 7支付寶聯(lián)手6家銀行 網(wǎng)購可用信用卡支付
- 8電力行業(yè)需彌補信息化自身的不足
- 9信息化規(guī)劃要突出業(yè)務(wù)分析重組
- 10綠色IT如何幫助企業(yè)實現(xiàn)雙贏?
- 11Java和.Net:網(wǎng)絡(luò)服務(wù)誰主沉???
- 12網(wǎng)站成為制約保險電子商務(wù)發(fā)展的關(guān)鍵
- 13[原創(chuàng)]ITIL咨詢心得
- 14軟件公司的績效管理與內(nèi)部消耗
- 15ITSM市場 誰來撼動四大管理廠商?
- 16分析現(xiàn)實中存在的對SOA的誤讀
- 17如果SOA無法虛擬化 就沒有靈活性
- 18Web服務(wù)引發(fā)全球軟件業(yè)“大地震”
- 19微軟: 乘醫(yī)改東風(fēng)
- 20[原創(chuàng)]面壁ITIL之事件管理
- 21經(jīng)濟危機之下的“高薪酬”刺激了誰的神經(jīng)?
- 22網(wǎng)上銀行:讓我不用它幾乎不可能
- 23解讀項目實施過程中的溝通管理
- 24OA辦公系統(tǒng)與其他管理軟件系統(tǒng)的區(qū)別
- 25加快推進統(tǒng)計信息化建設(shè)
- 26ITIL V3的出現(xiàn)改變了什么
- 27Visual Studio .NET中的XML Web services入門
- 28[原創(chuàng)]ITIL系列專題(九)—流程的管理流程
- 29重慶2014年最新施工企業(yè)名錄
- 30部門績效指標(biāo)中的“進步項”與“日常項”
成都公司:成都市成華區(qū)建設(shè)南路160號1層9號
重慶公司:重慶市江北區(qū)紅旗河溝華創(chuàng)商務(wù)大廈18樓
版權(quán)所有:泛普軟件 渝ICP備14008431號-2 渝公網(wǎng)安備50011202501700號 咨詢電話:400-8352-114