Web Services使用SOAP Header

时间:2022-11-15 04:22:29

在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 Services使用SOAP Header

在Web Service的Web Method接收到Soap Header:

Web Services使用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的更多相关文章

  1. Web Services之SOAP学习

    Web Services之SOAP [toc] 什么是SOAP SOAP(Simple Object Access Protocol)简单对象访问协议是在分散或分布式的环境中交换信息的简单的协议,是一 ...

  2. &lpar;转&rpar;Java实现Web Service过程中处理SOAP Header的问题

    网上有篇文章,大致这么说的(如下文),最后我采用的wsimport  -XadditionalHeaders的方式. StrikeIron offers two authentication meth ...

  3. SOAP Binding&colon; Difference between Document and RPC Style Web Services

    SOAP Binding: Difference between Document and RPC Style Web Services 20FLARES Twitter 1Facebook 9Goo ...

  4. Delphi 6 Web Services初步评估之三(转)

    Delphi 6 Web Services初步评估之三(转)   Delphi 6 Web Services初步评估之三(转)★ 测试总体印象:在整个测试中,对Delphi 6创建的Web Servi ...

  5. Web Services 指南之:Web Services 综述

    在本系列指南中.我们学习了怎样使用 Web Services.可是一个 web service 还包含可以使它活跃的组件.诸如 WSDL.UDDI 以及 SOAP.接下来我们了解一下 WSDL.UDD ...

  6. Web Services 中XML、SOAP和WSDL的一些必要知识

    Web Services 是由xml来定义数据格式的,通过SOAP协议在各个系统平台中传输,那么接下来讨论下SOAP和WSDL的各自作用. SOAP和WSDL对Web Service.WCF进行深入了 ...

  7. web services &plus; soap &plus; wsdl 学习

    什么是web services? 应用程序组件: 使用开放协议进行通信: 独立(self - contained )并可自我描述: 可通过使用UDDI来发现: 可被其他应用程序使用: XML是Web ...

  8. Web Services 平台元素SOAP、WSDL 、UDDI

    Web Services 拥有三种基本的元素:SOAP.WSDL 以及 UDDI. 什么是 SOAP? SOAP 是一种使应用程序有能力通过 HTTP 交换信息的基于 XML 的简易协议.或者可以更简 ...

  9. 使用LoadRunner对Web Services进行调用--Import Soap

    利用LoadRunner对Web Services进行测试时,通常有三种可供采用的方法: 在LoadRunner的Web Services虚拟用户协议中,[Add Service Call] 在Loa ...

随机推荐

  1. 【hive】——Hive初始了解

    1.没有接触,不知道这个事物是什么,所以不会产生任何问题.2.接触了,但是不知道他是什么,反正我每天都在用.3.有一定的了解,不够透彻.那么hive,1.我们对它了解多少?2.它到底是什么?3.hiv ...

  2. 正则表达式抓取文件内容中的http链接地址

    import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileNotFoundException; ...

  3. 基于Delphi的三层数据库系统的实现方法

    基于Delphi的三层数据库系统的实现方法   1  引言 当前的数据库应用系统中,按其结构划分为两类,一类是两层结构的数据库应系统,另一类是多层结构的数据库应用系统. 两层结构的数据库应用系统包括客 ...

  4. JS中的控制函数调用:call&lpar;&rpar;&comma;apply&lpar;&rpar;和bind&lpar;&rpar;

    所有的函数都具有call(),apply()和bind()方法.它们可以在执行方法的时候用一个值指向this,并改变面向对象的作用域. apply方法: 以下的两种表达式是等价的: func(arg1 ...

  5. Linux apache日志分析常用命令汇总

    1.查看当天有多少个IP访问: awk '{print $1}' log_file|sort|uniq|wc –l 2.查看某一个页面被访问的次数: grep "/index.php&quo ...

  6. BZOJ 3872 Ant colony

    Description There is an entrance to the ant hill in every chamber with only one corridor leading int ...

  7. iOS7——图像资源Images Assets

    iOS7初体验(3)——图像资源Images Assets 分类: iOS开发2013-06-18 16:02 17583人阅读 评论(2) 收藏 举报 ios7Images xcassets图像资源 ...

  8. IT技术 &vert; 让程序员抓狂的排序算法教学视频

    点击「箭头所指处」可快速关注传智特刊微信号:CZTEKAN 原文地址:http://mp.weixin.qq.com/s?__biz=MjM5OTM4NDMyMg==&mid=20056820 ...

  9. git撤销中间的某次提交

    这几天在开发一个新功能,应为着急上线,所以就把代码提交上去了,当现在有时间又要再改改,又要把我那次提交全部删掉,想重新再写,但是代码已经合了,而且还有其他同事的代码,我的提交在中间的某个部分,所以我想 ...

  10. part1&colon;4-linux快速体验

    1.Linux部分目录结构介绍 /:根目录,一般根目录下只存放目录,尽量不要存放文件:/etc./bin./dev./lib./sbin应该和根目录放置在一个分区中. /bin:可执行二进制文件目录, ...