日期:2011-04-16  浏览次数:20519 次

  XML 文档中编码的数据是该格式的一部分。XML 文档由根 Envelope 标记组成,而该标记又由必需的 Body 元素和可选的 Header 元素组成。Body 元素由特定于消息的数据组成。可选的 Header 元素可以包含不与特定消息直接相关的附加消息。Header 元素的每个子元素都叫做 SOAP 标头。

虽然 SOAP 标头可以包含与该消息相关的数据(因为 SOAP 规范没有严格地定义 SOAP 标头的内容),但是它们通常包含 Web 服务器中基础结构处理的信息。

使用 ASP.NET 创建的 XML Web services 可以定义和操作 SOAP 标头。定义 SOAP 标头是通过定义表示特定 SOAP 标头中数据的类以及从 SoapHeader 类中派生该类完成的。

创建一个从 SoapHeader 类派生的类,其名称与 SOAP 标头的根元素匹配。

public class MyHeader : SoapHeader

添加公共字段或属性,与 SOAP 标头中每个元素的名称和它们各自的数据类型匹配。
例如,在给定以下 SOAP 标头的情况下,其后的类定义一个表示 SOAP 标头的类。

<soap:Header xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <MyHeader xmlns="http://www.contoso.com">
    <Username>MyUsername</Username>
    <Password>MyPassword</Password>
  </MyHeader>
</soap:Header>


public class MyHeader : SoapHeader
{
   public string Username;
   public string Password;
}

在 XML Web services 中处理 SOAP 标头

将公共成员添加到实现表示 SOAP 标头类型的 XML Web services 的类。
[WebService(Namespace="http://www.contoso.com")]
public class MyWebService
{
    // Add a member variable of the type deriving from SoapHeader.
    public MyHeader myHeaderMemberVariable;

将 SoapHeader 属性应用于要处理 SOAP 标头的每个 XML Web services 方法。将 SoapHeader 特性的 MemberName 属性设置为第一步中创建的成员变量的名称。 
    [WebMethod]
    [SoapHeader("myHeaderMemberVariable")]
    public void MyWebMethod()

在应用 SoapHeader 特性的每个 XML Web services 方法中,访问在第一步中创建的成员变量以处理在 SOAP 标头中发送的数据。 
    [WebMethod]
    [SoapHeader("myHeaderMemberVariable")]
    public void MyWebMethod()
    {
        // Process the SoapHeader.
        if (myHeaderMemberVariable.Username == "admin")
        {
           // Do something interesting.
        }
    }

实例:

MyWebService XML Web services 具有一个名为 myHeaderMemberVariable 的成员变量,该成员变量属于从 SoapHeader (MyHeader) 派生的类型并设置为 SoapHeader 特性的 MemberName 属性。另外,将 SoapHeader 特性应用于指定 myHeaderMemberVariable 成员变量的 MyWebMethod XML Web services 方法。在 MyWebMethod XML Web services 方法中,访问 myHeaderMemberVariable 成员变量来获取 SOAP 标头的 Username XML 元素的值。

<%@ WebService Language="C#" Class="MyWebService" %>
using System.Web.Services;
using System.Web.Services.Protocols;

// Define a SOAP header by deriving from the SoapHeader base class.
public class MyHeader : SoapHeader
{
    public string Username;
    public string Password;
}

[WebService(Namespace="http://www.contoso.com")]
public class MyWebService
{
    // Add a member variable of the type deriving from SoapHeader.
    public MyHeader myHeaderMemberVariable;
 
    // Apply a SoapHeader attribute.
    [WebMethod]
    [SoapHeader("myHeaderMemberVariable")]
    public void MyWebMethod()
    {
        // Process the SoapHeader.
        if (myHeaderMemberVariable.Username == "admin"