成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

.asmx處理程序提供的功能之XML映射

開(kāi)發(fā) 后端
本文介紹.asmx處理程序提供的功能之XML映射。在 WebMehod 處理程序確定了要調(diào)用的方法之后,它需要將 XML 消息反序列化為可在方法調(diào)用過(guò)程中提供的 .NET 對(duì)象。

將 XML映射到對(duì)象
在 WebMehod 處理程序確定了要調(diào)用的方法之后,它需要將 XML 消息反序列化為可在方法調(diào)用過(guò)程中提供的 .NET 對(duì)象。如同消息調(diào)度一樣,該處理程序通過(guò)以下方法來(lái)實(shí)現(xiàn)上述目標(biāo):通過(guò)反射來(lái)檢查該類,以便確定如何處理傳入的 XML 消息。XmlSerializer 類在 System.Xml.Serialization 命名空間中自動(dòng)完成 XML 和對(duì)象之間的映射。

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

對(duì)于上面說(shuō)明的 Add 示例,XmlSerializer 會(huì)將 x 和 y 元素映射為 .NET 雙精度值,這些值隨后會(huì)在調(diào)用 Add 時(shí)提供。Add 方法向調(diào)用方返回一個(gè)雙精度值,該值隨后將需要重新序列化為 SOAP 響應(yīng)中的一個(gè) XML 元素。

 將 XML 映射到對(duì)象

圖 4. 將 XML映射到對(duì)象
XmlSerializer 還可以自動(dòng)處理復(fù)雜的類型(除了上面描述的限制)。例如,下面的 WebMethod 計(jì)算兩個(gè) Point 結(jié)構(gòu)之間的距離:

  1. using System;   
  2. using System.Web.Services;   
  3. public class Point {   
  4. public double x;    
  5. public double y;   
  6. }   
  7. [WebService(Namespace="urn:geometry")]   
  8. public class Geometry {   
  9. [WebMethod]   
  10. public double Distance(Point orig, Point dest) {   
  11. return Math.Sqrt(Math.Pow(orig.x-dest.x, 2) +   
  12. Math.Pow(orig.y-dest.y, 2));   
  13. }   
  14. }   

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

  1. < soap:Envelope    
  2. xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"   
  3. >   
  4. < soap:Body>   
  5. < Distance xmlns="urn:geometry">   
  6. < orig>   
  7. < x>0< /x>   
  8. < y>0< /y>   
  9. < /orig>   
  10. < dest>   
  11. < x>3< /x>   
  12. < y>4< /y>   
  13. < /dest>   
  14. < /Distance>   
  15. < /soap:Body>   
  16. < /soap:Envelope>   

在本例中,SOAP 響應(yīng)消息將包含一個(gè) DistanceResponse 元素,該元素包含一個(gè)雙精度類型的 DistanceResult 元素:

  1. < soap:Envelope    
  2. xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"   
  3. >   
  4. < soap:Body>   
  5. < DistanceResponse    
  6. xmlns="urn:geometry">   
  7. < DistanceResult>5< /DistanceResult>    
  8. < /DistanceResponse>   
  9. < /soap:Body>   
  10. < /soap:Envelope>   

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

您可以通過(guò)使用大量的內(nèi)置映射屬性從標(biāo)準(zhǔn)的 XML 映射中解放出來(lái)。例如,可以使用 [XmlType] 屬性來(lái)自定義類型的名稱和命名空間。可使用 [XmlElement] 和 [XmlAttribute] 屬性來(lái)控制參數(shù)或類成員分別映射到元素或?qū)傩缘姆绞健_€可以使用 [SoapDocumentMethod] 屬性來(lái)控制方法本身如何映射到請(qǐng)求/響應(yīng)消息中的元素名稱。例如,使用散布于下面程序片段中的多種屬性檢查如下版本的 Distance:

  1. using System;   
  2. using System.Web.Services;   
  3. using System.Web.Services.Protocols;   
  4. using System.Xml.Serialization;   
  5. public class Point {   
  6. [XmlAttribute]   
  7. public double x;   
  8. [XmlAttribute]    
  9. public double y;   
  10. }   
  11. [WebService(Namespace="urn:geometry")]   
  12. public class Geometry {   
  13. [WebMethod]   
  14. [SoapDocumentMethod(RequestElementName="CalcDistance",   
  15. ResponseElementName="CalculatedDistance")]   
  16. [return: XmlElement("result")]   
  17. public double Distance(   
  18. [XmlElement("o")]Point orig, [XmlElement("d")]Point dest) {   
  19. return Math.Sqrt(Math.Pow(orig.x-dest.x, 2) +   
  20. Math.Pow(orig.y-dest.y, 2));   
  21. }   
  22. }   

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

  1. < soap:Envelope    
  2. xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"   
  3. >   
  4. < soap:Body>   
  5. < CalcDistance xmlns="urn:geometry">   
  6. < o x="0" y="0" />   
  7. < d x="3" y="4" />   
  8. < /CalcDistance>   
  9. < /soap:Body>   
  10. < /soap:Envelope>   

而且,它將生成一個(gè)如下所示的 SOAP 響應(yīng)消息:

  1. < soap:Envelope    
  2. xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"   
  3. >   
  4. < soap:Body>   
  5. < CalculatedDistance xmlns="urn:geometry">   
  6. < result>5< /result>   
  7. < /CalculatedDistance>   
  8. < /soap:Body>   
  9. < /soap:Envelope>   

.asmx 處理程序使用 SOAP document/literal 樣式來(lái)實(shí)現(xiàn)和描述上面顯示的默認(rèn)映射。這意味著該 WSDL 定義將包含用來(lái)描述 SOAP 消息中所使用的請(qǐng)求和響應(yīng)元素的字面上的 XML 架構(gòu)定義(例如,不使用 SOAP 編碼規(guī)則)。

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

正如您所看到的一樣,可以完全自定義給定方法映射到 SOAP 消息的方式。XmlSerializer 提供一個(gè)功能強(qiáng)大的序列化引擎,以及許多我們?cè)诒疚闹袥](méi)有時(shí)間進(jìn)行討論的功能。有關(guān) XmlSerializer 如何工作的更多信息,請(qǐng)查看 Moving to .NET and Web Services。在我的每月 MSDN Magazine 的 XML Files 專欄(可在聯(lián)機(jī)存檔中查看專欄列表)中,我還介紹了 XmlSerializer 的許多不易察覺(jué)的細(xì)微差別。

除了對(duì)參數(shù)的反序列化進(jìn)行處理以外,.asmx 處理程序還能夠?qū)?SOAP 頭進(jìn)行反序列化/序列化。SOAP 頭的處理方法與參數(shù)不同,因?yàn)樗鼈兺ǔ1灰暈閹庑畔ⅲ⑽粗苯雨P(guān)聯(lián)到某個(gè)特定的方法。因此,SOAP 頭的處理通常是通過(guò)偵聽(tīng)層完成的,從而使得 WebMethod 完全無(wú)須對(duì) SOAP 頭進(jìn)行處理。

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

例如,考慮下面的 SOAP 請(qǐng)求,其中包含有一個(gè)用于進(jìn)行身份驗(yàn)證的 UsernameToken 頭:

  1. < soap:Envelope    
  2. xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"   
  3. >   
  4. < soap:Header>   
  5. < x:UsernameToken xmlns:x="http://example.org/security">   
  6. < username>Mary< /username>   
  7. < password>yraM< /password>   
  8. < /x:UsernameToken>   
  9. < /soap:Header>   
  10. < soap:Body>   
  11. < CalcDistance xmlns="urn:geometry">   
  12. ...   

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

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

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

  1. using System;   
  2. using System.Web.Services;   
  3. using System.Web.Services.Protocols;   
  4. [WebService(Namespace="urn:geometry")]   
  5. public class Geometry {   
  6. public UsernameToken Token;   
  7. [WebMethod]   
  8. [SoapHeader("Token")]   
  9. public double Distance(Point orig, Point dest) {   
  10. if (!Token.username.Equals(Reverse(Token.password)))   
  11. throw new Exception("access denied");   
  12. return Math.Sqrt(Math.Pow(orig.x-dest.x, 2) +   
  13. Math.Pow(orig.y-dest.y, 2));   
  14. }   
  15. }   

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

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

  1. < soap:Envelope    
  2. xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"   
  3. >   
  4. < soap:Body>   
  5. < soap:Fault>   
  6. < faultcode>soap:Server< /faultcode>       
  7. < faultstring>Server was unable to process request. --&gt; access denied< /faultstring>   
  8. < detail />   
  9. < /soap:Fault>   
  10. < /soap:Body>   
  11. < /soap:Envelope>   

如果您希望對(duì) SOAP Fault 元素進(jìn)行更多的控制,則還可以顯式引發(fā) SoapException 對(duì)象,以便指定所有的 SOAP Fault 元素細(xì)節(jié),例如,faultcode、faulstring、faultactor 和 detail 元素。有關(guān)更多信息,請(qǐng)查看 Using SOAP Faults。

正如您所看到的一樣,要知曉 WebMethod 如何工作必須了解基礎(chǔ)序列化引擎及其各種選項(xiàng)。序列化引擎的好處在于,它隱藏了所有的基礎(chǔ) XML API 代碼,而在自定義處理程序中,您通常必須編寫這些代碼。盡管多數(shù)開(kāi)發(fā)人員發(fā)現(xiàn)這很好,但是,有一些開(kāi)發(fā)人員卻認(rèn)為它是一個(gè)缺陷,因?yàn)樗麄內(nèi)韵MH自處理 WebMethod 實(shí)現(xiàn)中的原始 SOAP 消息。

【編輯推薦】

  1. .asmx處理程序提供的功能之消息調(diào)度
  2. WebMethod框架:實(shí)現(xiàn)Web服務(wù)的更高效方法
  3. .NET框架基本要求(.NET1.1)
  4. P2PMessageQueue的實(shí)際用法
  5. 點(diǎn)對(duì)點(diǎn)消息隊(duì)列函數(shù):用于WinCE的IPC機(jī)制
責(zé)任編輯:yangsai 來(lái)源: MSDN
相關(guān)推薦

2009-08-06 18:15:31

消息調(diào)度.asmx處理程序

2009-08-07 14:14:27

自動(dòng)生成WSDL.asmx處理程序

2010-03-05 13:28:34

SpringObject XML

2009-12-09 09:55:39

ibmdwSpring

2009-09-29 15:58:22

Hibernate映射

2021-12-27 08:27:17

SpringMVC面試

2011-03-07 11:12:36

FileZilla

2013-08-20 16:14:46

pythonpython文本處理

2009-08-05 16:32:25

Smooks 1.2框

2009-02-10 09:23:03

DOM模型MSXML

2009-06-03 14:06:44

ibmdwXML

2020-02-18 13:05:44

Windows 10功能Windows

2011-07-25 16:31:51

iOS XML 文件

2009-08-18 16:42:49

C# 操作XML

2011-01-21 10:59:01

sendmail群發(fā)

2009-02-26 13:35:10

XMLSAXParserJDOM

2011-04-13 16:35:47

HTTPASP.NET

2019-05-30 14:58:56

Pythonxml文件

2012-05-15 09:31:11

Windows 8IE 10

2009-08-18 16:30:41

C# 操作XML
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 91精品久久久久久久 | 99热精品在线 | 日韩一区二区三区视频 | 91在线视频网址 | 精品91久久 | av国产精品 | av网站免费观看 | 亚洲高清在线观看 | 亚洲高清在线免费观看 | 欧美午夜精品 | 亚洲视频在线免费 | 97精品国产97久久久久久免费 | 欧美一区二区三区四区五区无卡码 | 精品国产精品三级精品av网址 | 欧美一级特黄aaa大片在线观看 | 黄色毛片在线看 | 国产精品美女久久久久久免费 | 久久一区二区三区四区五区 | av永久| 亚洲欧美日韩精品久久亚洲区 | 午夜看片 | 亚洲天堂av一区 | 国产精品久久久久久久久久久久午夜片 | 91成人在线 | 国产成人久久精品一区二区三区 | 亚洲一区二区视频在线播放 | 国产欧美精品 | 91视频在线 | 日韩欧美视频在线 | 日韩欧美高清 | 免费一级毛片 | 国产成人jvid在线播放 | 成人在线精品 | 日本人做爰大片免费观看一老师 | 在线观看av不卡 | 美女亚洲一区 | 午夜小视频在线播放 | 亚洲综合首页 | 国产一区二区精品在线 | 久久精品国产久精国产 | 亚洲综合婷婷 |