中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何理解.asmx處理程序提供的XML映射功能

發布時間:2021-11-25 09:16:23 來源:億速云 閱讀:156 作者:柒染 欄目:編程語言

本篇文章為大家展示了如何理解.asmx處理程序提供的XML映射功能,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

將 XML映射到對象
在 WebMehod 處理程序確定了要調用的方法之后,它需要將 XML 消息反序列化為可在方法調用過程中提供的 .NET 對象。如同消息調度一樣,該處理程序通過以下方法來實現上述目標:通過反射來檢查該類,以便確定如何處理傳入的 XML 消息。XmlSerializer 類在 System.Xml.Serialization 命名空間中自動完成 XML 和對象之間的映射。

XmlSerializer 使將任何公共的 .NET 類型映射到 XML 架構類型成為可能,在建立了這樣的映射之后,它可以在 .NET 對象和 XML 實例文檔之間自動映射(請參閱圖 4)。目前,XmlSerializer 被限制于 XML 架構所支持的模型中,因此無法處理當今所有復雜的現代對象模型,例如,復雜的非樹型對象圖、雙重指針等。不過,XmlSerializer 能夠處理開發人員傾向使用的大多數復雜類型。

對于上面說明的 Add 示例,XmlSerializer 會將 x 和 y 元素映射為 .NET 雙精度值,這些值隨后會在調用 Add 時提供。Add 方法向調用方返回一個雙精度值,該值隨后將需要重新序列化為 SOAP 響應中的一個 XML 元素。

如何理解.asmx處理程序提供的XML映射功能

圖 4. 將 XML映射到對象
XmlSerializer 還可以自動處理復雜的類型(除了上面描述的限制)。例如,下面的 WebMethod 計算兩個 Point 結構之間的距離:

using System;   using System.Web.Services;   public class Point {   public double x;    public double y;   }   [WebService(Namespace="urn:geometry")]   public class Geometry {   [WebMethod]   public double Distance(Point orig, Point dest) {   return Math.Sqrt(Math.Pow(orig.x-dest.x, 2) +   Math.Pow(orig.y-dest.y, 2));   }   }

此操作的 SOAP 請求消息將包含一個 Distance 元素,該元素中包含兩個子元素,一個叫做 orig,另一個叫做 dest,它們都應當包含 x 和 y 子元素,如下所示:

< soap:Envelope    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"   >   < soap:Body>   < Distance xmlns="urn:geometry">   < orig>   < x>0< /x>   < y>0< /y>   < /orig>   < dest>   < x>3< /x>   < y>4< /y>   < /dest>   < /Distance>   < /soap:Body>   < /soap:Envelope>

在本例中,SOAP 響應消息將包含一個 DistanceResponse 元素,該元素包含一個雙精度類型的 DistanceResult 元素:

< soap:Envelope    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"   >   < soap:Body>   < DistanceResponse    xmlns="urn:geometry">   < DistanceResult>5< /DistanceResult>    < /DistanceResponse>   < /soap:Body>   < /soap:Envelope>

默認的 XML映射將方法的名稱用作請求元素的名稱,將參數的名稱用作請求元素的子元素的名稱。每個參數的結構都取決于類型的結構。公共字段和屬性的名稱只是映射到子元素(在本例中是 Point 中的x 和 y)。在默認情況下,響應元素的名稱是請求元素的名稱后面加上 "Response"。響應元素也包含一個子元素,名稱是請求元素的名稱后面加上 "Result"。

您可以通過使用大量的內置映射屬性從標準的 XML 映射中解放出來。例如,可以使用 [XmlType] 屬性來自定義類型的名稱和命名空間。可使用 [XmlElement] 和 [XmlAttribute] 屬性來控制參數或類成員分別映射到元素或屬性的方式。還可以使用 [SoapDocumentMethod] 屬性來控制方法本身如何映射到請求/響應消息中的元素名稱。例如,使用散布于下面程序片段中的多種屬性檢查如下版本的 Distance:

using System;   using System.Web.Services;   using System.Web.Services.Protocols;   using System.Xml.Serialization;   public class Point {   [XmlAttribute]   public double x;   [XmlAttribute]    public double y;   }   [WebService(Namespace="urn:geometry")]   public class Geometry {   [WebMethod]   [SoapDocumentMethod(RequestElementName="CalcDistance",   ResponseElementName="CalculatedDistance")]   [return: XmlElement("result")]   public double Distance(   [XmlElement("o")]Point orig, [XmlElement("d")]Point dest) {   return Math.Sqrt(Math.Pow(orig.x-dest.x, 2) +   Math.Pow(orig.y-dest.y, 2));   }   }

這個版本的 Distance 希望傳入具有如下外觀的 SOAP 消息:

< soap:Envelope    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"   >   < soap:Body>   < CalcDistance xmlns="urn:geometry">   < o x="0" y="0" />   < d x="3" y="4" />   < /CalcDistance>   < /soap:Body>   < /soap:Envelope>

而且,它將生成一個如下所示的 SOAP 響應消息:

< soap:Envelope    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"   >   < soap:Body>   < CalculatedDistance xmlns="urn:geometry">   < result>5< /result>   < /CalculatedDistance>   < /soap:Body>   < /soap:Envelope>

.asmx 處理程序使用 SOAP document/literal 樣式來實現和描述上面顯示的默認映射。這意味著該 WSDL 定義將包含用來描述 SOAP 消息中所使用的請求和響應元素的字面上的 XML 架構定義(例如,不使用 SOAP 編碼規則)。

.asmx 處理程序還可以使用 SOAP rpc/encoded 樣式。這意味著 SOAP 正文中包含一個 RPC 調用的 XML 表示形式,而且參數都使用 SOAP 編碼規則(例如,不需要 XML 架構)進行了序列化。為了實現這個目標,可以使用 [SoapRpcService] 和 [SoapRpcMethod] 屬性,而不使用 [SoapDocumentService] 和 [SoapDocumentMethod] 屬性。有關這些樣式之間的區別的更多信息,請查看 Understanding SOAP。

正如您所看到的一樣,可以完全自定義給定方法映射到 SOAP 消息的方式。XmlSerializer 提供一個功能強大的序列化引擎,以及許多我們在本文中沒有時間進行討論的功能。有關 XmlSerializer 如何工作的更多信息,請查看 Moving to .NET and Web Services。在我的每月 MSDN Magazine 的 XML Files 專欄(可在聯機存檔中查看專欄列表)中,我還介紹了 XmlSerializer 的許多不易察覺的細微差別。

除了對參數的反序列化進行處理以外,.asmx 處理程序還能夠對 SOAP 頭進行反序列化/序列化。SOAP 頭的處理方法與參數不同,因為它們通常被視為帶外信息,并未直接關聯到某個特定的方法。因此,SOAP 頭的處理通常是通過偵聽層完成的,從而使得 WebMethod 完全無須對 SOAP 頭進行處理。

但是,如果您希望親自處理 WebMethod 中的頭信息,則必須提供一個從 SoapHeader 派生的 .NET 類,此類代表該頭的 XML 架構類型(遵循上面描述的同一映射準則)。然后定義該類型的成員變量,以便讓其充當頭實例的占位符。***,批注每個需要訪問該頭的 WebMethod,以便指定您想要到達的字段的名稱。

例如,考慮下面的 SOAP 請求,其中包含有一個用于進行身份驗證的 UsernameToken 頭:

< soap:Envelope    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"   >   < soap:Header>   < x:UsernameToken xmlns:x="http://example.org/security">   < username>Mary< /username>   < password>yraM< /password>   < /x:UsernameToken>   < /soap:Header>   < soap:Body>   < CalcDistance xmlns="urn:geometry">   ...

為了使 .asmx 處理程序能夠反序列化該頭,首先需要定義一個表示隱含的 XML 架構類型的 .NET 類(注:如果您實際上已經知道了該頭的 XML 架構,則可以使用 xsd.exe /c 來生成該類)。在本例中,相應類的外觀如下所示:

[XmlType(Namespace="http://example.org/security")]   [XmlRoot(Namespace="http://example.org/security")]   public class UsernameToken : SoapHeader {   public string username;   public string password;   }

接著,只需在 WebMethod 類中定義一個用來保存頭類的實例的成員變量,并用 [SoapHeader] 屬性批注 WebMethod,如下所示:

using System;   using System.Web.Services;   using System.Web.Services.Protocols;   [WebService(Namespace="urn:geometry")]   public class Geometry {   public UsernameToken Token;   [WebMethod]   [SoapHeader("Token")]   public double Distance(Point orig, Point dest) {   if (!Token.username.Equals(Reverse(Token.password)))   throw new Exception("access denied");   return Math.Sqrt(Math.Pow(orig.x-dest.x, 2) +   Math.Pow(orig.y-dest.y, 2));   }   }

然后,您可以在 WebMethod 中訪問 Token 字段并提取在該頭中提供的信息。您也可以使用同樣的方法將頭重新發送到客戶端 — 您只需在 [SoapHeader] 屬性中指定頭的方向。有關在 WebMethod 框架中處理 SOAP 頭的更多信息,請查看 Digging into SOAP Headers with the .NET Framework。

.asmx 處理程序也提供了 .NET 異常的自動序列化。由 .asmx 處理程序捕獲的任何未經處理的異常都自動序列化為響應中的 SOAP Fault 元素。例如,在上例中,如果用戶名與反轉密碼不匹配,代碼將引發一個 .NET 異常。.asmx 處理程序隨后將捕獲該異常,并將它序列化為 SOAP 響應,如下所示:

< soap:Envelope    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"   >   < soap:Body>   < soap:Fault>   < faultcode>soap:Server< /faultcode>       < faultstring>Server was unable to process request. --&gt; access denied< /faultstring>   < detail />   < /soap:Fault>   < /soap:Body>   < /soap:Envelope>

如果您希望對 SOAP Fault 元素進行更多的控制,則還可以顯式引發 SoapException 對象,以便指定所有的 SOAP Fault 元素細節,例如,faultcode、faulstring、faultactor 和 detail 元素。有關更多信息,請查看 Using SOAP Faults。

正如您所看到的一樣,要知曉 WebMethod 如何工作必須了解基礎序列化引擎及其各種選項。序列化引擎的好處在于,它隱藏了所有的基礎 XML API 代碼,而在自定義處理程序中,您通常必須編寫這些代碼。盡管多數開發人員發現這很好,但是,有一些開發人員卻認為它是一個缺陷,因為他們仍希望親自處理 WebMethod 實現中的原始 SOAP 消息。

上述內容就是如何理解.asmx處理程序提供的XML映射功能,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

xml
AI

阿坝县| 平泉县| 扎鲁特旗| 礼泉县| 攀枝花市| 黔东| 昌吉市| 华阴市| 渭源县| 华宁县| 铁力市| 昌江| 铅山县| 二连浩特市| 策勒县| 喜德县| 景德镇市| 扶风县| 锡林郭勒盟| 宜君县| 桦南县| 广昌县| 新兴县| 当雄县| 瓮安县| 香格里拉县| 顺平县| 冀州市| 阳曲县| 玛曲县| 洛南县| 揭阳市| 册亨县| 蚌埠市| 西乌珠穆沁旗| 安福县| 九台市| 阿尔山市| 元朗区| 郧西县| 巴里|