ASP.NET Web Service如何工作(3)
ASP.NET Web Service如何工作(3)
| [日期:2003-06-26] | 来源:CSDN 作者:sunnyzhao(翻译) | [字体:大 中 小] |
为了使.asmx句柄有可能反串行化SOAP头,首先你需要定义一个.NET类,它代表了暗含的XML Schema类。在此例中相应的类如下:
然后你需要在WebMethod类中定义一个成员变量来控制一个头类的实例,同样要为WebMethods标记[SoapHeader]属性。见如下:
这样,在WebMethod中你可以访问Token域,并提取SOAP头提供的信息。你也可以使用同样的技术将头信息送回客户端——你需要在[SoapHeader]属性声明中指定头的方向。
.asmx句柄也提供了.NET异常的自动串行化。任何被.asmx句柄劫获的未处理的异常都会被自动串行化为应答消息中的SOAP Fault元素。比如,在前面的例子中,假如用户名与反转的口令不匹配,我们的代码将会抛出一个.NET异常。.asmx句柄劫获这个异常,将它串行化为下面的SOAP应答:
如果你想更多的控制SOAP Fault元素,也可以通过指定所有SOAP Fault元素细节来明确抛出一个SOAP异常对象。比如:faultcode, faulstring, faultactor, detail元素。
领会WebMethods如何工作需要理解根本的串行化引擎和它的各种选项。串行化引擎的好处就是它隐藏了定制句柄中底层的XML API代码。然而尽管许多开发人员认为这样很好,一些人也认为这也是它的缺陷,因为他们想亲手来处理WebMethod中未经加工的SOAP消息。
自动生成WSDL文档
写好并部署了一个WebMethod后,客户需要明确知道和它成功通信SOAP消息应该是个什么样子。提供Web服务描述的标准方法是通过WSDL(和嵌入的XSD定义)。.asmx句柄自动的生成了人性化的可读文档和WSDL定义,它准确的反映了WebMethod接口。如果在你的WebMethods中应用了一些映射属性,它们将都被反映在生成的文档中。
假如你浏览这个.asmx文件,你将看到一个人性化的可读文档页面就像图2中显示的那样。这个文档页是由DefaultWsdlHelpGenerator.aspx (在 C:\windows\Microsoft.NET\Framework\v1.0.3705\config中)生成的。打开这个文件你会看到它就是一个标准的ASP.NET页面,它使用.NET reflection生成那个文档。这个特点使文档一直与代码同步,可以通过简单的修改这个文件来定制你的生成文档。
也可以在Web.config文件中指定一个不同的文档文件来绕过基于虚拟目录文档生成器:
如果客户端发出请求.asmx终点,且请求字符串后加“?wsdl”,.asmx句柄将生成一个WSDL定义而不是一个人性化的可读文档。客户端可以使用WSDL定义生成代理类,它自动的知道怎样和Web服务通信。
要定制WSDL生成过程,你可以写一个SoapExtensionReflector类并在你的Web.config文件中注册到WebMethods框架。然后当.asmx句柄生成WSDL定义时,它将会调用你的反映类(reflector)使你有机会定制提供给用户的最后定义。
同样你也可以采用两种技术来绕过WSDL生成过程。首先,可以在你的虚拟目录下提供一个静态的WSDL文档供客户访问,然后从Web.config文件中除去文档生成器(如下所示)。
另外一个比较自动化的技术是使用[WebServiceBinding]属性来指定WebMethod类实现的静态WSDL文档在虚拟目录中的位置,也要用[SoapDocumentMethod]属性为每一个实现的WebMethod指定WSDL绑定的名字。这样做以后,自动WSDL生成过程将会导入你的静态WSDL文件,生成一个新的服务描述。
手工编写WSDL是极端困难的,因为现在没有很多WSDL编辑器。因此自动文档/WSDL生成是WebMethod框架中有价值的一部分。没有它,许多开发者的日子会很难过的。
总结
ASP.NET WebMethods框架为创建WEB服务提供了高效的方法。WebMethods使得传统的.NET方法能够成为支持HTTP、XML、XML Schema和WSDL的Web服务操作。WebMethod(.asmx)句柄自动决定怎样将到来的SOAP请求消息分派到适当的方法,然后又将请求消息中的XML元素串行化为相应的.NET对象。为简化集成客户端,.asmx句柄也支持可读文档和WSDL的生成。
和自己定制的IhttpHandlers相比,尽管WebMethods框架有点受限,它还是提供了称为SOAP扩展框架的强大扩展模型。SOAP扩展允许你引入我们上面没有讨论到的额外功能来满足你的具体需要。比如,微软发布了Web Serivices Enhancements1.0,它提供了SoapExtension类,为WebMethods框架引入了几个GXA规范的支持。
</soap:Envelope>
ASP.NET Web Service如何工作(3)的更多相关文章
- ASP.NET Web Service如何工作(2)
ASP.NET Web Service如何工作(2) [日期:2003-06-26] 来源:CSDN 作者:sunnyzhao(翻译) [字体:大 中 小] HTTP管道一旦调用了.asmx句柄,便 ...
- ASP.NET Web Service如何工作(1)
ASP.NET Web Service如何工作(1) [日期:2003-06-26] 来源:CSDN 作者:sunnyzhao(翻译) [字体:大 中 小] Summary ASP.NET Web ...
- 【转载】在 Visual Studio 2012 中创建 ASP.Net Web Service
在 Visual Studio 2012 中创建 ASP.Net Web Service,步骤非常简单.如下: 第一步:创建一个“ASP.Net Empty Web Application”项目 创建 ...
- Visual Studio 2010中创建ASP.Net Web Service
转自:http://blog.csdn.net/xinyaping/article/details/7331375 很多人在论坛里说,在Visual Studio 2010中不能创建“ASP.Net ...
- 在 Visual Studio 2010 中创建 ASP.Net Web Service
第一步:创建一个“ASP.Net Empty Web Application”项目 第二步:在项目中添加“Web Service”新项目 第一步之后,Visual Studio 2010会创建一个仅含 ...
- (转)在 Visual Studio 2010 中创建 ASP.Net Web Service
很多人在论坛里说,在Visual Studio 2010中不能创建“ASP.Net Web Service”这种project了,下面跟帖者云云,有的说这是因为微软已经将Web Service整合进W ...
- ASP.NET Web Service中使用Session 及 Session丢失解决方法 续
原文:ASP.NET Web Service中使用Session 及 Session丢失解决方法 续 1.关于Session丢失问题的说明汇总,参考这里 2.在Web Servcie中使用Sessio ...
- 微软实战训练营(X)重点班第(1)课:SOA必备知识之ASP.NET Web Service开发实战
微软实战训练营 上海交大(A)实验班.(X)重点班 内部课程资料 链接:http://pan.baidu.com/s/1jGsTjq2 password:0wmf <微软实战训练营(X)重点班第 ...
- ASP.NET WEB SERVICE 创建、部署与使用
PS: 开发工具 VS2010, 所有工程都为Debug状态,本人刚接触 Web Service,此文为菜鸟入门用例,高手勿笑! 转载请注明出处 :http://www.cnblogs.com/yyc ...
随机推荐
- MAX16054
MAX16054是带有单个开关去抖以及内部闭锁电路的按键通/断控制器,可接受机械开关产生的嘈杂输入,并经过一个有工厂设置的延迟时间后产生干净的数字锁存输出. 开关通.断期间,MAX16054无接触抖动 ...
- Python Django manage.py提供的命令及用法
λpython manage.pyType'manage.py help <subcommand>'for help on a specific subcommand. Available ...
- Delphi- 一些H8记录
CheckOrder方法写在uDataModConn类里.
- java的socket 编程
之前在学校的时候,有时间但是总是学不进去,现在工作了,总想多学点东西,但是又是没有时间来学习,只能在工作的闲暇之余,给自己充充电,随着学习的深入,越来月发现Java真的很强大,几乎什么都可以做的,以下 ...
- SQLite使用教程7 删除表
http://www.runoob.com/sqlite/sqlite-drop-table.html SQLite 删除表 SQLite 的 DROP TABLE 语句用来删除表定义及其所有相关数据 ...
- java异步任务处理
1.场景 最近做项目的时候遇到了一个小问题:从前台提交到服务端A,A调用服务端B处理超时,原因是前端一次请求往db插1万数据,插完之后会去清理缓存.发送消息. 服务端的有三个操作 a.插DB b.清理 ...
- 本地或者是koala软件编译less文件为css
背景: 事情的起因是这般的,平时工作是在线上办公,样式是使用less来写,于是乎,这样我从线上download下来的less文件无法直接在自己的本地环境运行.有一个问题就是我要把less文件先编译成c ...
- linux集群时间同步
说明:由于hadoop集群对时间要求很高,所以集群内主机要经常同步.本文档适合ubuntu.redhat系列. 注:很多内容是在网上摘录,然后试验后总结,如有疑问可留言探讨. 1.设置主机时间准确(任 ...
- cocos2d-x 动画加速与减速
转自:http://novacreo.com/%E7%A8%8B%E5%BA%8F%E7%BB%84/cocos2d-x%E5%8A%A8%E7%94%BB%E5%8A%A0%E9%80%9F%E4% ...
- hadoop学习;block数据块;mapreduce实现样例;UnsupportedClassVersionError异常;关联项目源代码
对于开源的东东,尤其是刚出来不久,我认为最好的学习方式就是能够看源代码和doc,測试它的样例 为了方便查看源代码,关联导入源代码的项目 先前的项目导入源代码是关联了源代码文件 block数据块,在配置 ...