我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

本篇文章为大家展示了如何理解.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映射功能,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

本篇文章为大家展示了如何理解.asmx处理程序提供的XML映射功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。将 XML映射到对象在 WebMehod 处理程序确定了要调用的方法之后,它需要将 X
2023-06-18

.asmx处理程序提供的功能怎样自动生成WSDL

这篇文章将为大家详细讲解有关.asmx处理程序提供的功能怎样自动生成WSDL,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。自动生成WSDL在您写好并部署了 WebMethod 之后,客户端需
2023-06-18

控制面板中的添加删除程序功能不能正常使用如何处理

这篇文章将为大家详细讲解有关控制面板中的添加删除程序功能不能正常使用如何处理,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。  【故障现象】当使用“控制面板”中的“添加/删除程序”来卸载软件时,“添加/删除
2023-06-14

SQLServer 错误 33081 由于 Authenticode 签名或文件路径无效,未能加载加密提供程序“%.*ls”。 请检查以前的消息,了解其他失败信息。 故障 处理 修复 支持远程

详细信息 Attribute 值 产品名称 SQL Server 事件 ID 33081 事件源 MSSQLSERVER 组件 SQLEngine 符号名称 SEC_DLL_TRUST_VERIFICATION_FAILED ...
SQLServer 错误 33081 由于 Authenticode 签名或文件路径无效,未能加载加密提供程序“%.*ls”。  请检查以前的消息,了解其他失败信息。 故障 处理 修复 支持远程
2023-11-05

SQLServer 错误 33027 由于 Authenticode 签名或文件路径无效,未能加载加密提供程序“%.*ls”。 请检查以前的消息,了解其他失败信息。 故障 处理 修复 支持远程

详细信息 Attribute 值 产品名称 SQL Server 事件 ID 33027 事件源 MSSQLSERVER 组件 SQLEngine 符号名称 SEC_CRYPTOPROV_CANTLOADDLL ...
SQLServer 错误 33027 由于 Authenticode 签名或文件路径无效,未能加载加密提供程序“%.*ls”。 请检查以前的消息,了解其他失败信息。 故障 处理 修复 支持远程
2023-11-05

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录