靈活定義和處理SOAP頭訊息 (轉)

amyz發表於2007-08-15
靈活定義和處理SOAP頭訊息 (轉)[@more@]

  文件中編碼的資料是該格式的一部分。XML 文件由根 Envelope 標記組成,而該標記又由必需的 Body 元素和可選的 Header 元素組成。Body 元素由特定於訊息的資料組成。可選的 Header 元素可以包含不與特定訊息直接相關的附加訊息。Header 元素的每個子元素都叫做 P 標頭。

雖然 SOAP 標頭可以包含與該訊息相關的資料(因為 SOAP 規範沒有嚴格地定義 SOAP 標頭的內容),但是它們通常包含 中基礎結構處理的資訊。

使用 建立的 XML Web services 可以定義和操作 SOAP 標頭。定義 SOAP 標頭是透過定義表示特定 SOAP 標頭中資料的類以及從 microsoft.com/mshelp" />words="frlrfSystemsProtocolsSoapHeaderClassTopic">SoapHeader 類中派生該類完成的。

建立一個從 SoapHeader 類派生的類,其名稱與 SOAP 標頭的根元素匹配。

public class MyHeader : SoapHeader

新增公共欄位或屬性,與 SOAP 標頭中每個元素的名稱和它們各自的資料型別匹配。
例如,在給定以下 SOAP 標頭的情況下,其後的類定義一個表示 SOAP 標頭的類。


 
  MyUsername
  MyPassword
 


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

在 XML Web services 中處理 SOAP 標頭

將公共成員新增到實現表示 SOAP 標頭型別的 XML Web services 的類。
[WebService(Namespace="")]
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 元素的值。

" 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="")]
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")
  {
  // Do something interesting.
  }
  }
}

生成處理 SOAP 標頭的客戶端
當與 XML Web services 進行通訊時,XML Web services 客戶端可以傳送和接收 SOAP 標頭。當使用 Wsdl.exe 實用工具為預期或返回 SOAP 標頭的 XML Web services 生成類時,該代理類包括有關 SOAP 標頭的資訊。明確地說,代理類具有表示 SOAP 標頭的成員變數,這些 SOAP 標頭與 XML Web services 中的 SOAP 標頭互相關聯。代理類也具有表示 SOAP 標頭的相應的類的定義。例如,為上面的 XML Web services 生成的代理類將具有一個 MyHeader 型別的成員變數以及 MyHeader 類的定義。

建立表示 SOAP 標頭的類的新例項。

MyHeader mySoapHeader = new MyHeader();

為該 SOAP 標頭填充值。

mySoapHeader.Username = "username";
mySoapHeader.Password = "password";

建立該代理類的新例項。

MyWebService = new MyWebService();

將該 SOAP 標頭分配到表示 SOAP 標頭的代理類的成員變數。

proxy.MyHeaderValue = mySoapHeader
對與 XML Web services 方法通訊的代理類方法。
傳送到 XML Web services 的 SOAP 請求的 SOAP 標頭部分將包括在 SOAP 標頭物件中資料的內容。

string results = proxy.MyWebMethod();

下面演示如何將 SOAP 標頭從客戶端傳遞到 XML Web services。


 void Page_Load( o, EventArgs e)
 {

  MyHeader mySoapHeader = new MyHeader();

  // Populate the values of the SOAP header.
  mySoapHeader.Username = "username";
  mySoapHeader.Password = "password";

  // Create a new instance of the proxy class.
  MyWebService proxy = new MyWebService();
 
  // Add the MyHeader SOAP header to the SOAP request.
  proxy.MyHeaderValue = mySoapHeader;

  // Call the method on the proxy class that communicates with
  // your XML Web service method.
  string results = proxy.MyWebMethod();

  // Display the results of the method in a label.
  ReturnValue.Text = results;
 }


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-958291/,如需轉載,請註明出處,否則將追究法律責任。

相關文章