Cómo: Controlar encabezados SOAP requeridos por un cliente del servicio web XML
Este tema es específico de una tecnología heredada. Ahora, los servicios Web XML y los clientes de servicios Web XML deben crearse con Windows Communication Foundation.
Ejemplo de código
Un cliente puede requerir un método de servicio Web para interpretar correctamente las semántica del encabezado SOAP y procesarlo de manera adecuada para que la solicitud SOAP tenga éxito. Para ello, los clientes definen en atributo mustUnderstand del encabezado SOAP en 1. Por ejemplo, la siguiente solicitud SOAP requiere que el destinatario de la solicitud SOAP procese el encabezado 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>
El hecho de que el servicio Web defina el encabezado SOAP determina cómo debería el servicio Web administrar los encabezados SOAP requeridos por el cliente. ASP.NET controla una gran cantidad de trabajo en el caso en que el servicio Web defina el encabezado SOAP. En el procedimiento que sigue, puede obtener información sobre cómo administrar los dos casos.
Para administrar encabezados SOAP no definidos por el servicio Web, pero requeridos por un cliente de servicios Web
Siga los pasos para administrar los encabezados SOAP desconocidos de un cliente de servicios Web, prestando especial atención a la propiedad DidUnderstand del encabezado SOAP.
Para los encabezados SOAP que no estén definidos por el servicio Web, el valor inicial deDidUnderstand es false. Si ASP.NET detecta los encabezados SOAP con su propiedad DidUnderstand establecida como false después de que el método de servicio Web devuelva, se inicia unSoapHeaderException automáticamente.
Para administrar encabezados SOAP requeridos por un cliente de servicio Web y definidos por el servicio Web
Siga los pasos para procesar encabezados SOAP dentro de un servicio Web creado mediante ASP.NET dentro de cada método de servicio Web.
Para los encabezados SOAP definidos por el servicio Web y procesados en el método de servicio Web que recibe el encabezado SOAP, ASP.NET da por supuesto que el servicio Web comprende el encabezado SOAP y establece el valor inicial de DidUnderstand como true.
Ejemplo
El siguiente servicio Web MyWebService
define el encabezado SOAP MyHeader
y precisa que éste se envíe con cualquier llamada al método de servicio Web MyWebMethod
. Además, MyWebMethod
procesa cualquier encabezado SOAP desconocido. Para los encabezados SOAP que puede procesar MyWebMethod
, DidUnderstand se establece como true.
<%@ 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
Nota: |
---|
ASP.NET utiliza la propiedad DidUnderstand para comunicar con el método de servicio Web. No forma parte de la especificación SOAP; su valor no aparece en ninguna parte de la solicitud SOAP o respuesta de SOAP. |
Nota: |
---|
Si un servicio Web reenvía un encabezado SOAP, es muy importante seguir las reglas en la especificación SOAP, sobre todo aquellas que pertenecen al valor de Actor. Para obtener más detalles, consulte el sitio web de W3C (http://www.w3.org/TR/soap). |
Vea también
Referencia
SoapHeader
SoapHeaderAttribute
SoapUnknownHeader
SoapHeaderException
Conceptos
Generar clientes de servicios web XML