Visual 中的XML Web services入門
目錄
簡介
用托管代碼編寫的 XML Web services
使用 Visual Studio 創建 XML Web services
使用 Visual Studio 部署 XML Web services
使用 Visual Studio 訪問 XML Web services
總結
一
XML Web services是可以由潛在的異類系統通過Internet訪問的可編程單元
XML Web services可以由單個應用程序在內部使用或通過Internet對外公開供多個應用程序使用
XML Web services沒有追隨一般的代碼可移植性功能
XML Web services的一個核心特征是在服務的實施和使用方面的高度抽象
XML Web services將分布式應用程序的開發帶入了新的時代
有關詳細信息
二
ASP
在ASP
XML Web services由XML Web services入口點和實現XML Web services功能的代碼組成
使用XML Web services時
創建XML Web services
訪問XML Web services
XML Web services 可以是獨立的應用程序或大型 Web 應用程序的子組件
有關詳細信息
三
要使用 Visual Studio 創建采用托管代碼的 XML Web services
在 Visual Studio 中創建 ASP
默認情況下
有關詳細信息
WebService 處理指令
WebService 處理指令為 ASP
<%@ WebService Language="vb" Codebehind="Service1.asmx.vb"
Class="WebService1.Service1" %>
// C#
<%@ WebService Language="c#" Codebehind="Service1.asmx.cs"
Class="WebService1.Service1" %>
注意
在 Open With(打開方式)對話框中
Language 屬性指示開發 XML Web services 所使用的編程語言
有關詳細信息
System
System
如果 XML Web services 沒有繼承此類
有關詳細信息
WebService 屬性
每個 XML Web services 都需要唯一的命名空間
注意
WebService 屬性提供以下屬性
◆Description
此屬性的值包含描述性消息
◆Name
此屬性的值包含 XML Web services 的名稱
◆Namespace
此屬性的值包含 XML Web services 的默認命名空間
以下示例代碼說明了 WebService 屬性的用法
Name:="MyFavoritesService")> _
Public Class Service1
Inherits System.Web.Services.WebService
' 實現代碼。
End Class
// C#
[WebService(Namespace=//MyServer/MyWebServices/",
Description="此處可以放一些描述性文字。",
Name="MyFavoritesService")]
public class Service1 : System.Web.Services.WebService
{
// 實現代碼。
}
有關詳細信息,請參閱 Using the WebService Attribute。
WebMethod 屬性
以托管代碼創建 XML Web services 時,通過在 Public 方法聲明之前放置 WebMethod 屬性可以指定在 XML Web services 中可用的方法。Private 方法不能充當 XML Web services 的入口點,盡管它們可以采用相同的類並且 XML Web services 代碼可以調用它們。WebMethod 屬性必須應用到可用作 XML Web services 一部分的每種公共方法中。
WebMethod 屬性包含配置 XML Web services 行為的幾個屬性。例如,可以使用此屬性在相關服務幫助頁提供一個簡短說明。
WebMethod 屬性提供以下屬性:
◆BufferResponse
當設置為 True(默認設置)時,ASP.NET 將響應向下發送到客戶端之前先緩存整個響應。緩存是一種非常有效的方法,可以通過減少輔助進程和 Internet 信息服務 (IIS) 進程之間的通信來提高性能。當設置為 False 時,ASP.NET 會將響應緩存在 16 KB 的區塊中。通常,只有在不想一次將響應的全部內容都緩存在內存中時,才將此屬性設置為 False。例如,正在寫回一個將項流出數據庫的集合。除非另行指定,否則默認值為 True。
◆CacheDuration
此屬性的值指定 ASP.NET 緩存每個唯一參數設置結果所需的秒數。除非另行指定,否則默認值為 0,此設置將禁用結果緩存。
◆Description
此屬性的值提供了對 XML Web services 方法的說明,顯示於服務幫助頁中。除非另行指定,否則默認值為空字符串。
◆EnableSession
當設置為 False(默認設置)時,ASP.NET 將無法訪問 XML Web services 方法的會話狀態。當設置為 True 時,XML Web services 可以直接從 HttpContext.Current.Session 訪問會話狀態集合;在繼承了 WebService 基類的情況下,也可以使用 WebService.Session 屬性進行訪問。
◆MessageName
此屬性的值使 XML Web services 能夠使用別名來唯一標識重載的方法。除非另行指定,否則默認值為方法名。當為 MessageName 指定值後,結果 SOAP 消息會反映出此名稱而不是實際的方法名。
◆TransactionOption
此屬性的值指定 XML Web services 方法是否可以作為事務的根對象。雖然可以將 TransactionOption 屬性設置為 TransactionOption 枚舉類型的任意值,但是 XML Web services 方法僅有兩種可能行為:它不參與事務(Disabled、NotSupported 和 Supported),或是創建新事務(Required 和 RequiresNew)。除非另行指定,否則默認值為 TransactionOption.Disabled。要使用此屬性,需要向 System.EntERPriseServices.dll 添加一個引用。此命名空間包含的方法和屬性,提供了可在 COM+ 服務中找到的分布式事務模型。
System.EnterpriseServices.ContextUtil 類允許您使用 SetAbort 或 SetComplete 方法設置該事務。
以下示例代碼說明了 WebMethod 屬性的用法:
' Visual Basic
Public Class Service1
Inherits System.Web.Services.WebService
Description:="一些描述性的文字",
MessageName:="RetrieveData")> _
Public Function GetBigChunkOfData() As DataSet
' 實現代碼
End Function
End Class
// C#
public class Service1 : System.Web.Services.WebService
{
[WebMethod(BufferResponse=false,
CacheDuration=60,
Description="一些描述性的文字",
MessageName="RetrieveData")]
public DataSet GetBigChunkOfData()
{
// 實現代碼
}
}
有關詳細信息,請參閱 Using the WebMethod Attribute。
四、使用 Visual Studio 部署 XML Web services
當使用 Visual Studio .NET 創建采用了托管代碼的 XML Web services 時,應使用標准部署模型:編譯項目,然後將結果文件部署到生產服務器。項目 .dll 文件包含 XML Web services 代碼類文件(.asmx.vb 或 .asmx.cs)以及項目中的所有其他類文件,但不包含 .asmx 文件本身。然後,您可以將這一個項目 .dll 文件部署到生產服務器中,而無需附帶任何源代碼。當 XML Web services 接收到請求時,項目 .dll 文件將被加載並執行。
圖1:部署 XML Web services
要將 XML Web services 部署到非開發服務器,可以添加 Web 安裝項目,也可以將所需的文件復制到目標服務器。要使您的 XML Web services 可供其他人使用,需要將其部署到可供目標客戶端訪問的 Web 服務器。
有關詳細信息,請參閱 Deploying XML Web services in Managed Code。
服務幫助頁
從 Web 浏覽器調用 .asmx 文件,而不提供已識別的查詢字符串時,
.asmx 文件將為 XML Web services 返回一個自動生成的服務幫助頁。
例如,要訪問名為 Service1.asmx(本地計算機中 WebService1 項目的一部分)的 XML Web services 的服務幫助頁,可使用以下 URL:。
此服務幫助頁提供了 XML Web services 提供的以及您可以通過編程訪問的方法的列表。每種方法都含有一個指向其詳細信息的鏈接。另外,此幫助頁還包括指向 XML Web services 說明文檔的鏈接。
圖
服務幫助頁的文件名在配置文件的
\%Windows%
\Microsoft
\Framework
\[version]
\CONFIG
\DefaultWsdlHelpGenerator
由於服務幫助頁只是一個 ASP
有關詳細信息
服務方法幫助頁
服務方法幫助頁提供了與特定 XML Web services 方法相關的詳細信息
targetNamespace=//Walkthrough/XmlWebServices/">
/>
binding verb="GET">
operation location="/ConvertTemperature">
urlEncoded>
binding verb="POST">
operation location="/ConvertTemperature">
address
location="" />
address
location="" />
要訪問名為 Service1.asmx(本地計算機上 TempConvert2 項目的一部分)的 XML Web services 的服務說明(如上例所示),可使用以下 URL:。
有關詳細信息,請參閱 Web Services Description Language (WSDL) Explained。
XML Web services 發現
XML Web services 發現是對 XML Web services 說明進行定位和詢問的過程,是訪問 XML Web services 的基本步驟。通過發現進程,XML Web services 客戶端能夠在設計階段了解某個 XML Web services 是否存在,它的功能如何,以及如何正確與它進行交互操作。
然而,實現 XML Web services 的 Web 站點不需要支持該發現進程,而是由另一個站點負責說明服務(如 XML Web services 目錄)。另外,可能沒有一個公開的方法可用來查找服務,例如在創建專用服務時。
有關詳細信息,請參閱 XML Web services Discovery。
靜態發現 (.disco)
可以通過發布 .disco 文件(一個 XML 文檔,包含指向其他發現文檔、XSD 方案和服務說明的鏈接)來啟用 XML Web services 的程序發現。使用 ASP.NET 自動創建的 XML Web services 能夠提供生成的發現文檔。例如,要訪問名為 Service1.asmx(本地計算機中 WebService1 項目的一部分)的 XML Web services 發現文檔,可使用以下 URL:
以下示例顯示了發現文檔的結構:
注意:發現文檔是一個元素容器,通常包含提供 XML Web services 發現信息的資源鏈接 (URL)。如果 URL 是相對的,則假定它們是相對於發現文檔的位置。
有關詳細信息,請參閱 Fine-Tuning Discovery Mechanisms。
動態發現 (.vsdisco)
動態發現是 ASP.NET 通過開發 Web 服務器上的文件夾層次結構執行迭代搜索以查找可用的 XML Web services 的過程。動態發現 (.vsdisco) 文件是基於 XML 的文件,
可以包含零或多個
當從啟用了動態發現的 Web 服務器請求 .vsdisco 文件時,對於已通過動態發現進程進行定位的每個 Web Service,都會返回一個包含 Web Service 發現信息的發現文檔。
默認情況下,nfig 中禁用了動態發現。要積極控制哪些 XML Web services 客戶端可以發現服務,應該在開發 Web 服務器上只使用動態發現。當向生產 Web 服務器部署 XML Web services 時,應為那些希望客戶端能夠發現的 XML Web services 創建並發布一個靜態發現文件 (.disco)。
有關詳細信息,請參閱 Deploying XML Web services in Managed Code。
Web Service 目錄
部署完 XML Web services 後,如果希望其他人使用,需要考慮如何讓開發人員找到它。使 XML Web services 可以為多數人使用的一種既定方法是,將其注冊到 XML Web services 目錄中。通用說明、發現和集成 (UDDI) 項目提供了一份公司及其提供的服務的目錄。
有關詳細信息,請參閱 XML Web services Directories。
五、使用 Visual Studio 訪問 XML Web services
XML Web services 客戶端是指任何引用和使用 XML Web services 的組件或應用程序。它不必是基於客戶端的應用程序,事實上,在大多數情況下,您的 XML Web services 客戶端可能是其他 Web 應用程序(如 Web 窗體或其他 XML Web services)。當訪問采用托管代碼的 XML Web services 時,代理類和 .NET 框架將處理所有結構代碼。
從托管代碼訪問 XML Web services 是一個簡單的過程。首先,向希望訪問的 XML Web services 項目添加一個 Web 引用。Web 引用使用作為代理的方法為每個公開的 XML Web services 方法創建代理類。其次,添加 Web 引用的命名空間。最後,創建代理類實例並像訪問其他類的方法一樣訪問該類方法。
有關詳細信息,請參閱 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 是否滿足您的要求。
為了簡化代碼模型,用托管代碼編寫的應用程序使用一個 Web 引用來代表各本地 XML Web services。通過使用 Add Web Reference(添加 Web 引用)對話框向您的項目添加 Web 引用。此對話框使您可以浏覽您的本地服務器、Microsoft UDDI 目錄和 Internet 上的 XML Web services。
Add Web Reference(添加 Web 引用)對話框使用 XML Web services 發現進程,在從對話框中浏覽的 Web 站點上,查找合適的 XML Web services。對於給定的地址,它使用為查找 XML Web services 發現 (DISCO) 文檔並最終找到 XML Web 說明文檔(遵守 Web Service 說明語言 [WSDL] 的語法)而設計的算法來詢問 Web 站點。
當使用 Add Web Reference(添加 Web 引用)對話框查找到應用程序訪問的 XML Web services 後,單擊 Add Reference(添加引用)按鈕告訴 Visual Studio 將服務說明的一份副本下載到本地計算機,然後生成訪問所選 XML Web services 的代理類。代理類包含了一些方法,可以同步或異步調用公開的 XML Web services 方法。
有關詳細信息,請參閱 Locating XML Web services。
動態和靜態 URL
Web 引用可以使用靜態 URL,也可以使用動態 URL。Web 引用的 Web Reference URL 屬性用於指定引用的 XML Web services 的 URL。默認情況下,此屬性被設置為所選 XML Web services 的 URL(是一個靜態 URL)。
如果將 URL Behavior 屬性設置保留為默認值 Static,則當創建類實例時,會使用硬編碼的 URL 來設置該代理類的 URL 屬性。
如果將 Web 引用的 URL Behavior 屬性設置為 Dynamic,則應用程序在運行時將從您的應用程序配置文件的 部分獲得 URL,例如:
value=""/>
當您創建代理對象的實例時,您也可以通過編程來為應用程序的對象設置 URL 屬性。不管代理使用何種 URL,它必須是符合 WSDL 的 XML Web services;當添加 Web 引用時,應與已使用的 XML Web services 相匹配。否則,早期生成的代理類將不能與之交互。
添加 Web 引用時,您也可以使用 Visual Studio 所使用的同一工具(XML Web services 說明語言工具)生成代理類來創建代理類。當您不能從安裝 Visual Studio 的計算機上訪問 XML Web services 時,該方法是很有用的。例如,當 XML Web services 所在的網絡直到運行時仍不能被客戶端訪問時。然後,您要手動向應用程序項目添加工具生成的文件。
有關詳細信息,請參閱 Managing Project Web References。
使用代理類
生成的代理類有自己的命名空間,在創建代理類實例前,您必須向客戶端應用程序添加命名空間。對於其他類來說,在調用方法之前,您必須首先創建它的實例。此過程與創建其他類實例沒有區別。
當使用 Visual Studio 直接從 XML Web services 的服務說明中生成的代理類時,訪問采用托管代碼的 XML Web services 比較簡單。要訪問 XML Web services 方法,
您的客戶端應用程序應調用相應的代理對象同步方法或異步方法。這些方法執行必要的工作,來遠程調用需要的 XML Web services 方法。默認情況下,代理類使用 SOAP 來訪問 XML Web services 方法,因為 SOAP 對三種支持的協議操作(HTTP-GET、HTTP-POST 和 HTTP-SOAP)支持最豐富的數據類型。
通過 Add Web Reference(添加 Web 引用)進程生成的代理類來自System.Web.Service.Protocols.SoapHttpClientProtocol 類,它包含的幾個屬性可用來控制該類訪問 XML Web services 的行為。
除此以外,SoapHttpClientProtocol 類還提供了以下屬性:
◆ClientCertificates
此屬性允許客戶端在調用 XML Web services 方法時傳遞一個或多個客戶端證書(也叫做 Authenticode X.509 v.3 證書)。
◆CookieContainer
如果 XML Web services 方法使用會話狀態,那麼在響應標題中會向 XML Web services 客戶端(用來唯一標識 XML Web services 客戶端的會話)傳回一個 cookie。對於收到該 cookie 的 XML Web services 客戶端,必須創建一個 CookieContainer 的新實例並在調用 XML Web services 方法之前將其屬性指定為 CookieContainer。這就可以確保 cookie 能夠正確地包含在後續請求中。
◆Credentials
當使用 Credentials 屬性時,XML Web services 客戶端必須實例化實現 ICredentials 的類(如 NetworkCredential),然後設置專用於驗證機制的客戶憑證。NetworkCredential 類可以用來設置使用基本、摘要式、NTLM 和 Kerberos 身份驗證機制的驗證憑證。
◆PreAuthenticate
當 PreAuthenticate 為 True 時,如果驗證機制支持該設置,WWW 驗證標題將隨第一個請求發送。當 PreAuthenticate 為 False(默認值)時,無需先進行用戶身份驗證,就可以向 XML Web services 方法發送請求。如果知道 Web Service 需要驗證,就可以通過將屬性設置為 True 來節省一次往返操作。
◆Proxy
如果客戶端需要使用不同於在系統設置中所發現的代理設置,需要使用此屬性。可以使用 WebProxy 類來設置代理設置,因為它可以實現 IWebProxy。否則,默認代理設置可能將在配置文件中進行設置。
◆Timeout
超時(毫秒)用於同步調用 XML Web services。默認值是 100000 毫秒。將 Timeout 屬性值設置為 Timeout.Infinite,表示請求沒有超時。但是,Web 服務器仍然有可能引起請求在服務器端超時。
◆Url
此屬性的默認值由生成代理類的服務說明中所發現的 location 屬性確定。
有關詳細信息,請參閱 SoapHttpClientProtocol Class。
調用 XML Web services 方法
向 XML Web services 添加 Web 引用後,您可以調用 XML Web services 的公開方法並像訪問其他組件方法一樣來訪問結果。
在以下的示例代碼中,客戶端應用程序 (Application1) 訪問一個具有 Web 引用 (Converter) 的 XML Web services,該 Web 引用包含代理類 Service1,而代理類又有一個調用 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());
}
}
}
六、總結
XML Web services 提供了在松耦合環境中使用標准協議(HTTP、XML、SOAP 和 WSDL)交換消息的能力。消息可以是結構化的、帶類型的,也可以是松散定義的。由於 XML Web services 的基礎是標准協議,因此您的 XML Web services 應用程序能夠與很多實現、平台和設備進行通信。
可以使用 ASP.NET 頁框架創建 XML Web services,並使這些 XML Web services 能夠訪問 .NET 框架的許多功能。由於 ASP.NET 和 .NET 框架是采用托管代碼的 XML Web services 的基礎,開發人員可以專注於創建或訪問 XML Web services,而不需要編寫基礎結構代碼。
當您使用 Visual Studio 直接從 XML Web services 的服務說明中生成的代理類時,訪問采用托管代碼的 XML Web services 比較簡單。代理類代碼將方法調用轉換為請求消息,並將響應信息返回給方法的返回值。
From:http://tw.wingwit.com/Article/program/net/201311/11296.html