Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
La comunicación con un método de servicio Web XML mediante SOAP sigue un formato estándar. Parte de este formato son los datos que se codifican en un documento XML. El documento XML consta de una etiqueta Envelope que, a su vez, consta de un elemento requerido Body y un elemento opcional Header. El elemento Body incluye los datos específicos del mensaje. El elemento opcional Header puede contener información adicional no relacionada directamente con el mensaje específico. Cada elemento secundario del elemento Header se denomina encabezado SOAP.
Aunque los encabezados SOAP pueden contener datos relacionados con el mensaje, dado que en la especificación de SOAP no se define estrictamente el contenido de un encabezado SOAP, suelen contener información procesada por la infraestructura de un servidor Web. A modo de ejemplo, un encabezado SOAP se puede utilizar para suministrar información de enrutamiento del mensaje SOAP.
Definir y procesar encabezados SOAP
Los servicios Web XML creados mediante ASP.NET pueden definir y manipular encabezados SOAP. Para definir un encabezado SOAP se define una clase que represente los datos de un encabezado SOAP determinado y se derive de la clase SoapHeader.
Para definir una clase que represente un encabezado SOAP
Cree una clase que se derive de la clase SoapHeader con un nombre que coincida con el del elemento raíz del encabezado SOAP.
public class MyHeader : SoapHeader [Visual Basic] Public Class MyHeader : Inherits SoapHeaderAgregue campos públicos o propiedades, en los que coincidan los nombres y sus respectivos tipos de datos para cada elemento del encabezado SOAP.
Por ejemplo, a continuación del siguiente encabezado SOAP se define una clase que representa el encabezado SOAP.
public class MyHeader : SoapHeader { public DateTime Created; public long Expires; } [Visual Basic] Public Class MyHeader Inherits SoapHeader Public Created As DateTime Public Expires As Long End Class
Para procesar encabezados SOAP en un servicio Web XML
Agregue un miembro público a la clase que implementa el servicio Web XML del tipo que representa el encabezado SOAP.
[WebService(Namespace="https://www.contoso.com")] public class MyWebService { // Add a member variable of the type deriving from SoapHeader. public MyHeader timeStamp; [Visual Basic] <WebService(Namespace:="https://www.contoso.com")> _ Public Class MyWebService ' Add a member variable of the type deriving from SoapHeader. Public TimeStamp As MyHeaderAplique un atributo SoapHeader a cada método de servicio Web XML que vaya a procesar el encabezado SOAP. Establezca el nombre de la variable miembro creada en el primer paso como valor de la propiedad MemberName del atributo SoapHeader.
[WebMethod] [SoapHeader("timeStamp")] public void MyWebMethod() [Visual Basic] <WebMethod, SoapHeader("TimeStamp")> _ Public Sub MyWebMethod()En cada método de servicio Web XML al que se aplica el atributo SoapHeader, obtenga acceso a la variable miembro creada en el primer paso para procesar los datos enviados en el encabezado SOAP.
[WebMethod] [SoapHeader("timeStamp", Direction=SoapHeaderDirection.InOut)] public string MyWebMethod() { // Verify that the client sent the SOAP Header. if (timeStamp == null) { timeStamp = new MyHeader(); } // Set the value of the SoapHeader returned // to the client. timeStamp.Expires = 60000; timeStamp.Created = DateTime.UtcNow; return "Hello World"; } [Visual Basic] <WebMethod,SoapHeader("TimeStamp", _ Direction:=SoapHeaderDirection.InOut)> _ Public Function MyWebMethod() As String ' Verify that the client sent the SOAP Header. If (TimeStamp Is Nothing) Then TimeStamp = New MyHeader End If ' Set the value of the SoapHeader returned ' to the client. TimeStamp.Expires = 60000 TimeStamp.Created = DateTime.UtcNow Return "Hello World" End Function
En el siguiente código de ejemplo se muestra cómo definir y procesar un encabezado SOAP en un servicio Web XML creado mediante ASP.NET. El servicio Web XML MyWebService tiene una variable miembro denominada timeStamp, que es de un tipo que se deriva de SoapHeader (MyHeader) y está establecida como la propiedad MemberName del atributo SoapHeader. Además, se aplica un atributo SoapHeader al método de servicio Web XML MyWebMethod donde se especifica la variable miembro myHeaderMemberVariable. En el método de servicio Web XML MyWebMethod se tiene acceso a myHeaderMemberVariable para obtener el valor del elemento XML Created del encabezado SOAP.
<%@ WebService Language="C#" Class="MyWebService" %>
using System;
using System.Web.Services;
using System.Web.Services.Protocols;
// Define a SOAP header by deriving from the SoapHeader class.
public class MyHeader : SoapHeader
{
public DateTime Created;
public long Expires;
}
[WebService(Namespace="https://www.contoso.com")]
public class MyWebService : System.Web.Services.WebService
{
// Add a member variable of the type deriving from SoapHeader.
public MyHeader timeStamp;
// Apply a SoapHeader attribute.
[WebMethod]
[SoapHeader("timeStamp", Direction=SoapHeaderDirection.InOut)]
public string HelloWorld()
{
if (timeStamp == null)
timeStamp = new MyHeader();
timeStamp.Expires = 60000;
timeStamp.Created = DateTime.UtcNow;
return "Hello World";
}
}
[Visual Basic]
<%@ WebService Language="VB" Class="MyWebService" %>
Imports System
Imports System.Web.Services
Imports System.Web.Services.Protocols
' Define a SOAP header by deriving from the SoapHeader class.
Public Class MyHeader
Inherits SoapHeader
Public Created As DateTime
Public Expires As Long
End Class
<WebService(Namespace:="https://www.contoso.com")> _
Public Class MyWebService
Inherits System.Web.Services.WebService
' Add a member variable of the type deriving from SoapHeader.
Public timeStamp As MyHeader
' Apply a SoapHeader attribute.
<WebMethod(), _
SoapHeader("timeStamp", Direction:=SoapHeaderDirection.InOut)> _
Public Function HelloWorld() As String
If (timeStamp Is Nothing) Then
timeStamp = New MyHeader
End If
timeStamp.Expires = 60000
timeStamp.Created = DateTime.UtcNow
Return "Hello World"
End Function
End Class
In the previous example, a SOAP response is returned to the client with the Expires element set to 60000 (number of milliseconds, so 1 minute) and the Created element to the current time in coordinated universal time. That is, the following SOAP response is sent to the client.
<? xml version="1.0" encoding="utf-8" ?>
<soap:Envelope xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<MyHeader xmlns="https://www.contoso.com">
<Created>dateTime</Username>
<Expires>long</Password>
</MyHeader>
</soap:Header>
<soap:Body>
<HelloWorldResponse xmlns="https://www.contoso.com" />
</soap:Body>
</soap:Envelope>
Crear un cliente que procese encabezados SOAP
Un cliente de servicios Web XML puede enviar y recibir encabezados SOAP cuando se comunica con un servicio Web XML. Si se utiliza la utilidad Wsdl.exe para generar una clase de proxy para un servicio Web XML que espera recibir o devuelve encabezados SOAP, la clase de proxy incluye información acerca de los encabezados SOAP. Específicamente, la clase de proxy tiene variables miembro que representan los encabezados SOAP correspondientes a los del servicio Web XML. La clase de proxy también tiene definiciones para las clases correspondientes que representan el encabezado SOAP. Por ejemplo, las clases de proxy generadas para el servicio Web XML anterior tendrán una variable miembro de tipo MyHeader y una definición para la clase MyHeader. Para obtener más información sobre cómo crear una clase de proxy, vea Crear un proxy de servicio Web XML.
Nota: si en el servicio Web XML se definen variables miembro que representan los encabezados SOAP de tipo SoapHeader o SoapUnknownHeader en lugar de una clase que se deriva de SoapHeader, una clase de proxy no tendrá información acerca de ese encabezado SOAP.
Para procesar encabezados SOAP en un cliente de servicios Web XML
Cree una instancia nueva de la clase que representa el encabezado SOAP.
Dim header As MyHeader = New MyHeader() [C#] MyHeader header = new MyHeader();Llene los valores del encabezado SOAP.
header.Expires = 60000 header.Created = DateTime.UtcNow [C#] header.Expires = 60000; header.Created = DateTime.UtcNow;Cree una instancia nueva de la clase de proxy.
Dim proxy As MyWebService = New MyWebService() [C#] MyWebService proxy = new MyWebService();Asigne el objeto de encabezado SOAP a la variable miembro de la clase de proxy que representa el encabezado SOAP.
proxy.MyHeaderValue = header [C#] proxy.MyHeaderValue = header;Llame al método en la clase de proxy que se comunica con el método de servicio Web XML.
La parte de encabezado SOAP de la solicitud SOAP enviada al servicio Web XML incluirá el contenido de los datos almacenados en el objeto de encabezado SOAP.
Dim results as String = proxy.MyWebMethod() [C#] string results = proxy.MyWebMethod();
En el ejemplo de código siguiente se demuestra cómo pasar un encabezado SOAP desde un cliente a un servicio Web XML.
<%@ Page Language="VB" %>
<asp:Label id="ReturnValue" runat="server" />
<script runat=server language=VB>
Sub Page_Load(o As Object, e As EventArgs)
Dim header As MyHeader = New MyHeader() ' Populate the values of the SOAP header. header.Expires = 60000 header.Created = DateTime.UtcNow
' Create a new instance of the proxy class.
Dim proxy As MyWebService = New MyWebService()
' Add the MyHeader SOAP header to the SOAP request. proxy.MyHeaderValue = header
' Call the method on the proxy class that communicates
' with your XML Web service method.
Dim results as String = proxy.MyWebMethod()
' Display the results of the method in a label.
ReturnValue.Text = results
End Sub
</script>
[C#]
<%@ Page Language="C#" %>
<asp:Label id="ReturnValue" runat="server" />
<script runat=server language=c#>
void Page_Load(Object o, EventArgs e)
{
MyHeader header = new MyHeader(); // Populate the values of the SOAP header. header.Expires = 60000; header.Created = DateTime.UtcNow;
// Create a new instance of the proxy class.
MyWebService proxy = new MyWebService();
// Add the MyHeader SOAP header to the SOAP request. proxy.MyHeaderValue = header;
// 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;
}
</script>
Cambiar los destinatarios de encabezados SOAP
De forma predeterminada, un cliente de servicios Web XML envía encabezados SOAP a un método de servicio Web XML cuando se aplica un atributo SoapHeader a un método de servicio Web XML. Sin embargo, el método también puede enviar un encabezado SOAP al cliente de servicios Web XML. Asimismo, se puede enviar en ambas direcciones. El destinatario del encabezado SOAP se controla mediante el establecimiento de la propiedad Direction de un atributo SoapHeader aplicado a un método de servicio Web XML. La propiedad Direction es de tipo SoapHeaderDirection, que tiene cuatro valores: In, Out, InOut y Fault. Estos valores hacen referencia al destinatario (sea o no el servidor de servicios Web XML), cliente o servidor de servicios Web XML y cliente, y determinan si se envía o no el encabezado SOAP al cliente cuando el servicio Web XML inicia una excepción, respectivamente.
Nota: la versión 1.0 de .NET Framework SDK no admite el valor Fault.
Para cambiar el destinatario del encabezado SOAP
Defina el encabezado SOAP.
public class MyHeader : SoapHeader { public DateTime Created; public long Expires; } [Visual Basic] Public Class MyHeader Inherits SoapHeader Public Created As DateTime Public Expires As Long End ClassAgregue una variable miembro a la clase que implementa el servicio Web XML.
[WebService(Namespace="https://www.contoso.com")] public class MyWebService : WebService { public MyHeader myOutHeader; [Visual Basic] <WebService(Namespace:="https://www.contoso.com")> _ Public Class MyWebService Inherits WebService Public myOutHeader As MyHeaderAplique un atributo SoapHeader a cada método de servicio Web XML que procese el encabezado SOAP. Establezca la propiedad Direction para cada uno de los destinatarios previstos, mediante la enumeración SoapHeaderDirection. En el ejemplo siguiente se establece Direction como SoapHeaderDirection.Out para especificar el cliente de servicios Web XML como destinatario.
[WebMethod] [SoapHeader("myOutHeader",Direction=SoapHeaderDirection.Out)] [Visual Basic] <WebMethod, _ SoapHeader("myOutHeader",Direction:=SoapHeaderDirection.Out)>Procese o establezca el encabezado SOAP, dependiendo del destinatario. En el ejemplo de código siguiente se establecen los valores del encabezado SOAP, puesto que el destinatario es el cliente de servicios Web XML.
// Set the Time the SOAP message expires. myOutHeader.Expires = 60000; myOutHeader.Created = DateTime.UtcNow; [Visual Basic] ' Set the Time the SOAP message expires. myOutHeader.Expires = 60000 myOutHeader.Created = DateTime.UtcNow
En el ejemplo de código siguiente se define un encabezado SOAP MyHeader que se envía desde el método de servicio Web XML al cliente.
<%@ WebService Language="C#" Class="MyWebService" %>
using System;
using System.Web.Services;
using System.Web.Services.Protocols;
// Define a SOAP header by deriving from the SoapHeader class.
public class MyHeader : SoapHeader
{
public DateTime Created;
public long Expires;
}
[WebService(Namespace="https://www.contoso.com")]
public class MyWebService : WebService
{
public MyHeader myOutHeader;
[WebMethod]
[SoapHeader("myOutHeader",Direction=SoapHeaderDirection.Out)]
public void MyOutHeaderMethod()
{
// Set the time the SOAP message expires.
myOutHeader.Expires = 60000;
myOutHeader.Created = DateTime.UtcNow;
}
}
[Visual Basic]
<%@ WebService Language="VB" Class="MyWebService" %>
Imports System
Imports System.Web.Services
Imports System.Web.Services.Protocols
' Define a SOAP header by deriving from the SoapHeader class.
Public Class MyHeader
Inherits SoapHeader
Public Created As DateTime
Public Expires As Long
End Class
<WebService(Namespace:="https://www.contoso.com")> _
Public Class MyWebService
Inherits WebService
Public myOutHeader As MyHeader
<WebMethod, _
SoapHeader("myOutHeader",Direction:=SoapHeaderDirection.Out)> _
Public Sub MyOutHeaderMethod()
' Set the time the SOAP message expires.
myOutHeader.Expires = 60000
myOutHeader.Created = DateTime.UtcNow
End Sub
End Class
Controlar encabezados SOAP desconocidos
Un cliente de servicios Web XML puede enviar a un método de servicio Web XML una solicitud SOAP con un encabezado SOAP cuya recepción no esté definida de forma explícita en el servicio Web XML. En este caso, es importante determinar si la semántica del encabezado SOAP se entiende y se procesa, dado que en la especificación SOAP se indica que se inicia una excepción cuando los encabezados SOAP tienen un atributo mustUnderstand establecido a true. Para obtener más información sobre cómo controlar los encabezados SOAP requeridos por un cliente, vea Controlar encabezados SOAP requeridos por un cliente de servicios Web XML.
Para controlar encabezados SOAP desconocidos desde un cliente de servicios Web XML
Agregue una variable miembro a la clase que implementa el servicio Web XML con un tipo SoapUnknownHeader o SoapHeader, o una matriz de uno de ellos, para controlar varios encabezados SOAP desconocidos.
La declaración del tipo como una matriz o una única instancia de SoapUnknownHeader tiene la ventaja adicional de que SoapUnknownHeader tiene una propiedad Element. La propiedad Element es de tipo XmlElement y representa el documento XML para el elemento Header de la solicitud SOAP o la respuesta SOAP. En consecuencia, un método de servicio Web XML puede determinar el nombre del encabezado SOAP, junto con los datos pasados en el encabezado SOAP, mediante la consulta de la propiedad Element.
public class MyWebService { public SoapUnknownHeader[] unknownHeaders; [Visual Basic] Public Class MyWebService Public unknownHeaders() As SoapUnknownHeaderAplique un atributo SoapHeader a cada método de servicio Web XML que vaya a procesar los encabezados SOAP desconocidos.
[WebMethod] [SoapHeader("unknownHeaders")] public string MyWebMethod() [Visual Basic] <WebMethod, _ SoapHeader("unknownHeaders") > _ Public Function MyWebMethod() As StringAgregue código para determinar si puede procesar encabezados SOAP desconocidos.
Si la variable miembro es de tipo SoapUnknownHeader, un método de servicio Web XML puede determinar el nombre del encabezado SOAP, junto con los datos pasados en él, mediante la consulta de la propiedad Element. La propiedad Name de la propiedad Element identifica el nombre del encabezado SOAP.
foreach (SoapUnknownHeader header in unknownHeaders) { // Check to see if this a known header. if (header.Element.Name == "MyKnownHeader") [Visual Basic] Dim header As SoapUnknownHeader For Each header In unknownHeaders ' Check to see if this is a known header. If (header.Element.Name = "MyKnownHeader") ThenEstablezca a true el valor de la propiedad DidUnderstand de la variable miembro que representa el encabezado SOAP desconocido si se conoce la forma de procesar un encabezado SOAP determinado.
Si un método de servicio Web XML procesa un encabezado SOAP desconocido y no establece en true la propiedad DidUnderstand, se puede iniciar una excepción SoapHeaderException. Para obtener más información, vea Controlar encabezados SOAP requeridos por un cliente de servicios Web XML
// Check to see if this is a known header. if (header.Element.Name == "MyKnownHeader") header.DidUnderstand = true; else // For those headers that cannot be // processed, set DidUnderstand to false. header.DidUnderstand = false; } [Visual Basic] ' Check to see if this a known header. If (header.Element.Name = "MyKnownHeader") Then header.DidUnderstand = True Else ' For those headers that cannot be ' processed, set DidUnderstand to false. header.DidUnderstand = False End IfNota Los servicios Web XML creados mediante ASP.NET utilizan la propiedad DidUnderstand para comunicarse con el método de servicio Web XML. Ésta no forma parte de la especificación de SOAP. Su valor no aparece en ninguna parte de la solicitud SOAP o la respuesta SOAP.
Nota Cuando un cliente de servicios Web XML crea una clase de proxy mediante la herramienta Lenguaje de descripción de servicios Web (Wsdl.exe) y en un servicio Web XML se define la variable miembro que representa un encabezado SOAP con el tipo SoapUnknownHeader, no se agrega a la clase de proxy ninguna referencia a dicho encabezado SOAP. Si un cliente de servicios Web XML decide agregar ese encabezado SOAP a la solicitud SOAP, se debe modificar la clase de proxy para agregar una variable miembro y aplicar un atributo SoapHeader al método que realiza la llamada al método de servicio Web XML pertinente.
Controlar encabezados SOAP requeridos por un cliente de servicios Web XML
Para que la solicitud SOAP tenga éxito, un cliente puede requerir que un método de servicio Web XML interprete correctamente la semántica del encabezado SOAP y la procese como corresponda. Para que sea así, en los clientes se establece en 1 el atributo mustUnderstand del encabezado SOAP. Por ejemplo, en la siguiente solicitud SOAP se requiere que su destinatario 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>
La definición o no del encabezado SOAP en el servicio Web XML determina la forma en que el servicio Web XML debe controlar los encabezados SOAP requeridos por el cliente. ASP.NET se ocupa de gran parte del trabajo cuando el encabezado SOAP está definido en el servicio Web XML. En el procedimiento siguiente se explica cómo controlar los dos casos.
Para controlar encabezados SOAP no definidos en el servicio Web XML pero requeridos por un cliente de servicios Web XML
Siga los pasos para controlar encabezados SOAP desconocidos desde un cliente de servicios Web XML y preste especial atención a la propiedad DidUnderstand del encabezado SOAP.
Para los encabezados SOAP que no están definidos en el servicio Web XML, el valor inicial de DidUnderstand es false. Si ASP.NET detecta encabezados SOAP con la propiedad DidUnderstand establecida a false después de que vuelva el método de servicio Web XML, se inicia automáticamente una excepción SoapHeaderException.
Para controlar encabezados SOAP requeridos por un cliente de servicios Web XML y definidos en el servicio Web XML
Siga los pasos para procesar encabezados SOAP en un servicio Web XML creado mediante ASP.NET en cada método de servicio Web XML.
Para los encabezados SOAP definidos en el servicio Web XML y procesados en el método de servicio Web XML que recibe el encabezado SOAP, ASP.NET supone que el servicio Web XML entiende el encabezado SOAP y establece el valor inicial de DidUnderstand a true.
En el servicio Web MyWebService del ejemplo siguiente se define el encabezado SOAP MyHeader y se requiere que éste se envíe en todas las llamadas al método de servicios Web XML MyWebMethod. Además, el método MyWebMethod procesa los encabezados SOAP desconocidos. Para los encabezados SOAP que puede procesar MyWebMethod, la propiedad DidUnderstand se establece a true.
<%@ WebService Language="C#" Class="MyWebService" %>
using System.Web.Services;
using System.Web.Services.Protocols;
// Define a SOAP header by deriving from the SoapHeader 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";
}
}
[Visual Basic]
<%@ WebService Language="VB" Class="MyWebService" %>
Imports System.Web.Services
Imports System.Web.Services.Protocols
' Define a SOAP header by deriving from the SoapHeader 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 comunicarse con el método de servicio Web XML. Ésta no forma parte de la especificación SOAP; su valor no aparece en ninguna parte de la solicitud SOAP o la respuesta SOAP.
Si un servicio Web XML reenvía un encabezado SOAP, es muy importante seguir las reglas de la especificación SOAP, especialmente las referentes al valor de Actor. Para obtener más información, visite el sitio Web de W3C (World Wide Web Consortium), http://www.w3c.org/TR/SOAP/.
Controlar errores que se producen durante el procesamiento de un encabezado SOAP
Cuando un servicio Web XML detecta un error específico del procesamiento de un encabezado, se debe iniciar una excepción SoapHeaderException. El uso de esta clase de excepción permite que los servicios Web XML apliquen el formato correcto a la respuesta. Si el cliente se crea mediante .NET Framework, recibirá la excepción SoapHeaderException con su contenido, incluida la propiedad InnerException, colocada en la propiedad Message. La propiedad InnerException de la excepción SoapHeaderException detectada por el cliente será null. Éste es un modelo de programación admitido en .NET Framework, puesto que la excepción se envía a través de la red en un elemento XML <Fault> de SOAP, como se indica en la especificación de SOAP. Para obtener más información acerca de las excepciones, vea Controlar e iniciar excepciones en servicios Web XML.
En el ejemplo de código siguiente se inicia una excepción SoapHeaderException si un cliente realiza una solicitud SOAP al método de servicio Web XML MyWebMethod con el valor de la propiedad Username establecido a guest.
<%@ WebService Language="C#" Class="MyWebService" %>
using System.Web.Services;
using System.Web.Services.Protocols;
// Define a SOAP header by deriving from the SoapHeader class.
public class MyHeader : SoapHeader
{
public DateTime Created;
public DateTime Expires;
public DateTime Received;
}
[WebService(Namespace="https://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()
{
if (timeStamp == null)
timeStamp = new MyHeader();
else
{
// Check whether the SOAP message is expired.
if ((timeStamp.Expires.CompareTo(DateTime.UtcNow)) <= 0)
{
// The SOAP message is expired, so throw a SOAP header
// exception indicating that.
SoapHeaderException se = new SoapHeaderException(
"SOAP message expired before reaching this node.",
SoapException.ClientFaultCode,
this.Context.Request.Url.ToString());
throw se;
}
}
}
}
[Visual Basic]
<%@ WebService Language="VB" Class="MyWebService" %>
Imports System.Web.Services
Imports System.Web.Services.Protocols
' Define a SOAP header by deriving from the SoapHeader class.
Public Class MyHeader
Inherits SoapHeader
Public Created As DateTime
Public Expires As DateTime
Public Received As DateTime
End Class
<WebService(Namespace:="https://www.contoso.com")> _
Public Class MyWebService
' Add a member variable of the type deriving from SoapHeader.
Public myHeaderMemberVariable As MyHeader
' Apply a SoapHeader attribute.
<WebMethod, _
SoapHeader("myHeaderMemberVariable")> _
Public Sub MyWebMethod()
If (TimeStamp Is Nothing) Then
TimeStamp = New MyHeader
Else
' Check whether the SOAP message is expired.
If ((TimeStamp.Expires.CompareTo(DateTime.UtcNow)) <= 0) Then
' The SOAP message is expired, so throw a SOAP header
' exception indicating that.
Dim se As New SoapHeaderException( _
"SOAP message expired before reaching this node.", _
SoapException.ClientFaultCode, _
Me.Context.Request.Url.ToString())
Throw se
End If
End If
End Sub
End Class
Nota: .NET Framework 1.0 incluye la propiedad SoapHeaderAttribute.Required que cuando se establece en true habilita un servicio Web XML que requiere que un cliente envíe un encabezado SOAP específico. ASP.NET indica que se requiere un encabezado SOAP en un documento WSDL generado si establece en "true" el atributo wsdl:required del elemento soap:header. Los clientes de .NET Framework del servicio Web XML creado a partir del documento WSDL reciben una excepción SoapHeaderException si no envían el encabezado SOAP especificado, y los otros clientes reciben un error de SOAP. Para interactuar con otras implementaciones SOAP, esta funcionalidad se ha quitado de las versiones posteriores.
La propiedad Required está obsoleta en la versión 1.1, y la herramienta Lenguaje de descripción de servicios Web (Wsdl.exe) no tiene en cuenta el atributo wsdl:required del elemento soap:header en un documento WSDL. Como ya no se requiere un encabezado SOAP, un servicio Web XML debe comprobar que el campo o a la propiedad que representa el encabezado SOAP no es de tipo null, antes de obtener acceso a él.
Vea también
SoapHeader | SoapHeaderAttribute | SoapHeaderException | SoapUnknownHeader | Generar servicios Web XML mediante ASP. NET | Generar clientes de servicios Web XML