Condividi tramite


Procedura: Gestire le intestazioni SOAP richieste da un client di servizio Web XML

Esempio di codice

Un client può richiedere un metodo del servizio Web per interpretare correttamente la semantica dell'intestazione SOAP ed elaborarla di conseguenza per fare in modo che la richiesta SOAP sia valida. A tale scopo, i client hanno l'attributo mustUnderstand dell'intestazione SOAP impostato su 1. Ad esempio, nella richiesta SOAP seguente viene richiesto che il destinatario della richiesta SOAP elabori l'intestazione SOAP MyCustomSoapHeader.

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/" >
  <soap:Header>
    <MyCustomSoapHeader soap:mustUnderstand="1" xmlns="https://www.contoso.com">
      <custom>Keith</custom>
    </MyCustomSoapHeader>
  </soap:Header>
  <soap:Body>
    <MyUnknownHeaders xmlns="https://www.contoso.com" />
  </soap:Body>
</soap:Envelope>

Il fatto che il servizio Web riesca o meno a definire l'intestazione SOAP, determina come devono essere gestite nel servizio Web le intestazioni SOAP richieste dal client. ASP.NET gestisce molto del lavoro nel caso in cui l'intestazione SOAP sia definita nel Servizio Web. Nella procedura che segue, è possibile imparare come gestire i due casi.

Per gestire intestazioni SOAP non definite dal servizio Web, ma richieste da un client di servizio Web.

  • Seguire i passaggi per la gestione di intestazioni SOAP ignote a un client di servizio Web, prestando particolare attenzione alla proprietà DidUnderstand dell'intestazione SOAP.

    Per le intestazioni SOAP non definite dal servizio Web XML, il valore iniziale di DidUnderstand è false. Se ASP.NET rileva intestazioni SOAP con la proprietà DidUnderstand impostata su false dopo che il metodo del servizio Web restituisce un valore, viene generata automaticamente una classe SoapHeaderException.

Per gestire intestazioni SOAP richieste da un client di servizio Web e definite dal servizio Web.

  • Seguire i passaggi per l'elaborazione di intestazioni SOAP all'interno di un servizio Web creato utilizzando ASP.NET all'interno di ogni metodo del servizio Web.

    Per le intestazioni SOAP definite dal servizio Web e elaborate nel metodo del servizio Web che riceve l'intestazione SOAP, ASP.NET presuppone che il servizio Web abbia elaborato correttamente l'intestazione SOAP, impostando il valore iniziale di DidUnderstand su true.

Esempio

Nel servizio Web MyWebService riportato di seguito viene definita l'intestazione SOAP MyHeader e ne viene richiesto l'invio con una chiamata al metodo MyWebMethod del servizio Web. Inoltre, MyWebMethod elabora qualsiasi intestazione SOAP sconosciuta. Per le intestazioni SOAP che possono essere elaborate dal metodo MyWebMethod, la proprietà DidUnderstand viene impostata sutrue.

<%@ 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 MyValue;
}
public class MyWebService {
    public MyHeader myHeader;

    // Receive all SOAP headers other than the MyHeader SOAP header.
    public SoapUnknownHeader[] unknownHeaders;
 
    [WebMethod]
    [SoapHeader("myHeader")]
    //Receive any SOAP headers other than MyHeader.
    [SoapHeader("unknownHeaders")]
    public string MyWebMethod() 
    {
       foreach (SoapUnknownHeader header in unknownHeaders) 
       {
         // Perform some processing on the header.
         if (header.Element.Name == "MyKnownHeader")
               header.DidUnderstand = true;
         else
                // For those headers that cannot be 
                // processed, set DidUnderstand to false.
                header.DidUnderstand = false;
       }
       return "Hello";
    }
}
<%@ WebService Language="VB" Class="MyWebService" %>
Imports System.Web.Services
Imports System.Web.Services.Protocols

' Define a SOAP header by deriving from the SoapHeader base class.
Public Class MyHeader : Inherits SoapHeader
    Public MyValue As String
End Class

Public Class MyWebService
    Public myHeader As MyHeader
    
    ' Receive all SOAP headers other than the MyHeader SOAP header.
    Public unknownHeaders() As SoapUnknownHeader    
    
    <WebMethod, _
     SoapHeader("myHeader"), _
     SoapHeader("unknownHeaders")> _
    Public Function MyWebMethod() As String
        'Receive any SOAP headers other than MyHeader.
        Dim header As SoapUnknownHeader        For Each header In unknownHeaders
            ' Perform some processing on the header.
            If header.Element.Name = "MyKnownHeader" Then
                header.DidUnderstand = True
            ' For those headers that cannot be 
            ' processed, set DidUnderstand to false.
            Else
                header.DidUnderstand = False
            End If
        Next header
        Return "Hello"
    End Function
End Class
NoteNota:

La proprietà DidUnderstand viene utilizzata da ASP.NET per comunicare con il metodo del servizio Web. Non fa parte della specifica SOAP, il valore non viene visualizzato in nessuna parte della richiesta o della risposta SOAP.

NoteNota:

Se un'intestazione SOAP viene inoltrata da un servizio Web, è molto importante seguire le regole nella specifica SOAP, specialmente quelle che concernono il valore di Actor. Per ulteriori informazioni, visitare il sito Web di W3C all'indirizzo http://www.w3.org/TR/soap (informazioni in lingua inglese).

Vedere anche

Riferimenti

SoapHeader
SoapHeaderAttribute
SoapUnknownHeader
SoapHeaderException

Concetti

Creazione di client dei servizi Web XML

Altre risorse

Utilizzo delle intestazioni SOAP
Creare servizi Web XML mediante ASP.NET

Footer image

Copyright © 2007 Microsoft Corporation. Tutti i diritti riservati.