Web Services使用SOAP Header
在Web Services方法进行通信使用SOAP遵循标准的SOAP格式,该格式的一部分是在XML文档中编码的数据。XML文档包含一个Envelope根元素(由必需的Body元素和可选的Header元素构成)。Body元素由特定于消息的数据构成。可选的Header元素可以包含不与特定消息直接相关的其他信息。
一、定义和处理SOAP Header
在ASP.NET创建的Web Services可以定义和操作SOAP Header。通过在特定的SOAP Header中定义数据类并从SoapHeader类(在System.Web.Services.Protocols命名空间下)派生,便可完成SOAP Header的定义。
1: [WebService(Namespace = "http://tempuri.org/")]
2: [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
3: [System.ComponentModel.ToolboxItem(false)]
4: public class WebService_SoapHeader : System.Web.Services.WebService
5: {
6: //定义MySoapHeader变量用来保存SoapHeader值
7: public MySoapHeader mySoapHeader;
8:
9: [WebMethod]
10: [SoapHeader("mySoapHeader")]
11: public string HelloWorld(string name)
12: {
13: return "Hello,"+name;
14: }
15: }
16:
17: public class MySoapHeader : SoapHeader
18: {
19: public int UserID;
20: public DateTime LoginTime;
21: public string UserName;
22: }
23:
查看生成的SOAP的Post内容:
POST /WebService_SoapHeader.asmx HTTP/1.1
Host: localhost
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://tempuri.org/HelloWorld" <?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<MySoapHeader xmlns="http://tempuri.org/">
<UserID>int</UserID>
<LoginTime>dateTime</LoginTime>
<UserName>string</UserName>
</MySoapHeader>
</soap:Header>
<soap:Body>
<HelloWorld xmlns="http://tempuri.org/">
<name>string</name>
</HelloWorld>
</soap:Body>
</soap:Envelope>
二、客户端使用Soap Header
引用或使用Wsdl.exe工具可以生成Web Services的引用辅助类。Web Services定义的Soap Header会生成对应的代码:
1: [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1")]
2: [System.SerializableAttribute()]
3: [System.Diagnostics.DebuggerStepThroughAttribute()]
4: [System.ComponentModel.DesignerCategoryAttribute("code")]
5: [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://tempuri.org/")]
6: public partial class MySoapHeader : object, System.ComponentModel.INotifyPropertyChanged {
7:
8: private int userIDField;
9:
10: private System.DateTime loginTimeField;
11:
12: private string userNameField;
13:
14: private System.Xml.XmlAttribute[] anyAttrField;
15:
16: /// <remarks/>
17: [System.Xml.Serialization.XmlElementAttribute(Order=0)]
18: public int UserID {
19: get {
20: return this.userIDField;
21: }
22: set {
23: this.userIDField = value;
24: this.RaisePropertyChanged("UserID");
25: }
26: }
27:
28: /// <remarks/>
29: [System.Xml.Serialization.XmlElementAttribute(Order=1)]
30: public System.DateTime LoginTime {
31: get {
32: return this.loginTimeField;
33: }
34: set {
35: this.loginTimeField = value;
36: this.RaisePropertyChanged("LoginTime");
37: }
38: }
39:
40: /// <remarks/>
41: [System.Xml.Serialization.XmlElementAttribute(Order=2)]
42: public string UserName {
43: get {
44: return this.userNameField;
45: }
46: set {
47: this.userNameField = value;
48: this.RaisePropertyChanged("UserName");
49: }
50: }
51:
52: /// <remarks/>
53: [System.Xml.Serialization.XmlAnyAttributeAttribute()]
54: public System.Xml.XmlAttribute[] AnyAttr {
55: get {
56: return this.anyAttrField;
57: }
58: set {
59: this.anyAttrField = value;
60: this.RaisePropertyChanged("AnyAttr");
61: }
62: }
63:
64: public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
65:
66: protected void RaisePropertyChanged(string propertyName) {
67: System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
68: if ((propertyChanged != null)) {
69: propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
70: }
71: }
72: }
73:
对于Web Method,Soap Header会变成Web Method的第一个参数:
1: public string HelloWorld(Client.SoapHeaderService.MySoapHeader MySoapHeader, string name) {
2: Client.SoapHeaderService.HelloWorldRequest inValue = new Client.SoapHeaderService.HelloWorldRequest();
3: inValue.MySoapHeader = MySoapHeader;
4: inValue.name = name;
5: Client.SoapHeaderService.HelloWorldResponse retVal = ((Client.SoapHeaderService.WebService_SoapHeaderSoap)(this)).HelloWorld(inValue);
6: return retVal.HelloWorldResult;
7: }
8:
客户端测试代码,首先定义Soap Header,再把Soap Header作为Web Method的参数传递:
1: static void Main(string[] args)
2: {
3: SoapHeaderService.WebService_SoapHeaderSoapClient client = new SoapHeaderService.WebService_SoapHeaderSoapClient();
4:
5: SoapHeaderService.MySoapHeader soapHeader = new SoapHeaderService.MySoapHeader();
6: soapHeader.UserID = 1;
7: soapHeader.UserName = "User1";
8: soapHeader.LoginTime = DateTime.Now;
9:
10: client.HelloWorld(soapHeader, "UserA");
11: }
12:
利用tcpTrace可以查看Post的内容:
![]()
在Web Service的Web Method接收到Soap Header:
![]()
三、SoapHeader的Direction属性
SoapHeaderDirection有四个值,分别为In、Out、InOut、Flaut。模式值是In。
1、使用In定义Soap Header,In方式跟上面的例子一样。
2、使用Out定义Soap Header:
1: public class WebService_SoapHeader : System.Web.Services.WebService
2: {
3: public MySoapHeader mySoapHeader;
4:
5: [WebMethod]
6: [SoapHeader("mySoapHeader",Direction=SoapHeaderDirection.Out)]
7: public string HelloWorld(string name)
8: {
9: return "Hello,"+name;
10: }
11: }
12:
Soap的Reaspone内容:
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length <?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<MySoapHeader xmlns="http://tempuri.org/">
<UserID>int</UserID>
<LoginTime>dateTime</LoginTime>
<UserName>string</UserName>
</MySoapHeader>
</soap:Header>
<soap:Body>
<HelloWorldResponse xmlns="http://tempuri.org/">
<HelloWorldResult>string</HelloWorldResult>
</HelloWorldResponse>
</soap:Body>
</soap:Envelope>
3、使用InOut定义Soap Header:
1: [WebMethod]
2: [SoapHeader("mySoapHeader",Direction=SoapHeaderDirection.InOut)]
3: public string HelloWorld(string name)
4: {
5: return "Hello,"+name;
6: }
7:
Soap的Request:
POST /WebService_SoapHeader.asmx HTTP/1.1
Host: localhost
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://tempuri.org/HelloWorld" <?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<MySoapHeader xmlns="http://tempuri.org/">
<UserID>int</UserID>
<LoginTime>dateTime</LoginTime>
<UserName>string</UserName>
</MySoapHeader>
</soap:Header>
<soap:Body>
<HelloWorld xmlns="http://tempuri.org/">
<name>string</name>
</HelloWorld>
</soap:Body>
</soap:Envelope>
Soap的Response:
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length <?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<MySoapHeader xmlns="http://tempuri.org/">
<UserID>int</UserID>
<LoginTime>dateTime</LoginTime>
<UserName>string</UserName>
</MySoapHeader>
</soap:Header>
<soap:Body>
<HelloWorldResponse xmlns="http://tempuri.org/">
<HelloWorldResult>string</HelloWorldResult>
</HelloWorldResponse>
</soap:Body>
</soap:Envelope>
4、使用Fault定义Soap Header
1: [WebMethod]
2: [SoapHeader("mySoapHeader",Direction=SoapHeaderDirection.Fault)]
3: public string HelloWorld(string name)
4: {
5: return "Hello,"+name;
6: }
7:
使用Fault,Soap的描述跟使用Out基本一致:
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length <?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<MySoapHeader xmlns="http://tempuri.org/">
<UserID>int</UserID>
<LoginTime>dateTime</LoginTime>
<UserName>string</UserName>
</MySoapHeader>
</soap:Header>
<soap:Body>
<HelloWorldResponse xmlns="http://tempuri.org/">
<HelloWorldResult>string</HelloWorldResult>
</HelloWorldResponse>
</soap:Body>
</soap:Envelope>
四、处理未知的Soap Header
ASP.NET Web Service通过SoapUnknownHeader来标识未知的Soap Header,SOAP规范通过mustUnderstand特性来表示对Soap Header的要求,当mustUnderstand特性设置为true时,如果传入未知的Soap Header将引发异常。
注意:ASP.NET 使用DidUnderstand 属性来与 Web Services的方法进行通信。它不属于 SOAP 规范;它的值不会出现在 SOAP 请求或 SOAP 响应的任何部分中。
五、Soap Header的异常处理
当 Web Services检测到与处理 SOAP Header有关的错误时,应该会引发 SoapHeaderException。利用此异常类,Web Services可以正确地设置响应的格式。
Web Services使用SOAP Header的更多相关文章
- Web Services之SOAP学习
Web Services之SOAP [toc] 什么是SOAP SOAP(Simple Object Access Protocol)简单对象访问协议是在分散或分布式的环境中交换信息的简单的协议,是一 ...
- (转)Java实现Web Service过程中处理SOAP Header的问题
网上有篇文章,大致这么说的(如下文),最后我采用的wsimport -XadditionalHeaders的方式. StrikeIron offers two authentication meth ...
- SOAP Binding: Difference between Document and RPC Style Web Services
SOAP Binding: Difference between Document and RPC Style Web Services 20FLARES Twitter 1Facebook 9Goo ...
- Delphi 6 Web Services初步评估之三(转)
Delphi 6 Web Services初步评估之三(转) Delphi 6 Web Services初步评估之三(转)★ 测试总体印象:在整个测试中,对Delphi 6创建的Web Servi ...
- Web Services 指南之:Web Services 综述
在本系列指南中.我们学习了怎样使用 Web Services.可是一个 web service 还包含可以使它活跃的组件.诸如 WSDL.UDDI 以及 SOAP.接下来我们了解一下 WSDL.UDD ...
- Web Services 中XML、SOAP和WSDL的一些必要知识
Web Services 是由xml来定义数据格式的,通过SOAP协议在各个系统平台中传输,那么接下来讨论下SOAP和WSDL的各自作用. SOAP和WSDL对Web Service.WCF进行深入了 ...
- web services + soap + wsdl 学习
什么是web services? 应用程序组件: 使用开放协议进行通信: 独立(self - contained )并可自我描述: 可通过使用UDDI来发现: 可被其他应用程序使用: XML是Web ...
- Web Services 平台元素SOAP、WSDL 、UDDI
Web Services 拥有三种基本的元素:SOAP.WSDL 以及 UDDI. 什么是 SOAP? SOAP 是一种使应用程序有能力通过 HTTP 交换信息的基于 XML 的简易协议.或者可以更简 ...
- 使用LoadRunner对Web Services进行调用--Import Soap
利用LoadRunner对Web Services进行测试时,通常有三种可供采用的方法: 在LoadRunner的Web Services虚拟用户协议中,[Add Service Call] 在Loa ...
随机推荐
- [JDBC]查询结果集把字段名和字段值一起竖向输出
代码: package com.hy.fieldandvalue; import java.sql.Connection; import java.sql.DriverManager; import ...
- macOS: mac下配置charles来抓取http请求
1. 准备charles 下载链接:https://www.charlesproxy.com/download/ 2. 配置charles 2.1)配置http代理.打开Charles软件,配置htt ...
- iptables保存规则(ubuntu和centos)
1.Ubuntu 首先,保存现有的规则: iptables-save > /etc/iptables.rules 然后新建一个bash脚本,并保存到/etc/network/if-pre-up. ...
- kotlin中val和var的区别
var: var是一个可变变量,这是一个可以通过重新分配来更改为另一个值的变量.这种声明变量的方式和Java中声明变量的方式一样.val: val是一个只读变量,这种声明变量的方式相当于java中的f ...
- 003-结构型-07-享元模式(Flyweight)
一.概述 提供了减少对象数且从而改善应用所需的对象结构的方式.运用共享技术有效地支持大是细粒度的对象. 它通过与其他类似对象共享数据来减小内存占用.它使用共享物件,用来尽可能减少内存使用量以及分享资讯 ...
- iframe子页面无法返回上一页的问题
本文讨论的场景是ipad终端. 如题,因业务需要,需要使用iframe嵌套子页面.让外层始终保持一个socket连接,避免socket每跳转一个页面都要重新关闭建立连接的问题.但是这样问题来了,上线后 ...
- 查看所使用的Linux系统是32位还是64 位的方法
方法一:getconf LONG_BIT # getconf LONG_BIT 1 1 我的Linux是32位!!! 方法二:arch # arch 1 1 显示 i686 就是32位,显示 x86_ ...
- Python基础教程(第2版 修订版) pdf
Python基础教程(第2版 修订版) 目录 D11章快速改造:基础知识11.1安装Python11.1.1Windows11.1.2Linux和UNIX31.1.3苹果机(Macintosh)41. ...
- redis和memcache对比
1.性能方面:没有必要过多的关心性能,因为二者的性能都已经足够高了.由于Redis只使用单核,而Memcached可以使用多核,所以在比较上,平均每一个核上Redis在存储小数据时比Memcached ...
- windows xp能连上网但是不能上网的解决办法
说明:我是使用这个办法解决了,并不能针对所有的情况. 具体情况是,在win xp下,能够看到当前的无线网络,并且也能够连接到无线网络. 但是连接上无线网络之后,他的ip地址和网关是没有改变的.所以也连 ...