Compartir a través de


Cómo: establecer los encabezados en la solicitud de cliente (Servicios de datos de WCF)

Cuando use la biblioteca cliente de Servicios de datos de Microsoft WCF para acceder a un servicio de datos compatible con Open Data Protocol (OData), la biblioteca establece automáticamente los encabezados HTTP necesarios en los mensajes de solicitud enviados al servicio de datos. Sin embargo, la biblioteca cliente no sabe establecer los encabezados de mensaje necesarios en ciertos casos, como cuando el servicio de datos necesita cookies o autenticación basada en notificaciones. Para obtener más información, vea Securing WCF Data Services. En estos casos, debe establecer manualmente los encabezados de mensaje del mensaje de solicitud antes de enviarlo. En el ejemplo de este tema se muestra cómo controla el evento SendingRequest para agregar un nuevo encabezado al mensaje de solicitud antes de que se envíe al servicio de datos.

En el ejemplo de este tema se usa el servicio de datos de ejemplo Northwind y las clases del servicio de datos de cliente generadas automáticamente. Se crean este servicio y las clases de datos del cliente al completar el tutorial rápido del servicio de datos de WCF. Además puede usar el servicio de datos de ejemplo Northwind que se publica en el sitio web de OData. Este servicio de datos de ejemplo es de solo lectura y si se intentan guardar los cambios, devuelve un error. Los servicios de datos de ejemplo del sitio web de OData permiten la autenticación anónima.

Ejemplo

En el siguiente ejemplo se registra un controlador del evento SendingRequest y, a continuación, se ejecuta una consulta en el servicio de datos.

Nota

Cuando un servicio de datos necesita que se establezca manualmente el encabezado del mensaje de todas las solicitudes, plantéese registrar el controlador del evento SendingRequest mediante la invalidación del método parcial OnContextCreated del contenedor de entidades que represente el servicio de datos, que en este caso es NorthwindEntities.

' Create the DataServiceContext using the service URI.
Dim context As NorthwindEntities = New NorthwindEntities(svcUri)

' Register to handle the SendingRequest event.
' Note: If this must be done for every request to the data service, consider
' registering for this event by overriding the OnContextCreated partial method in 
' the entity container, in this case NorthwindEntities. 
AddHandler context.SendingRequest, AddressOf OnSendingRequest

' Define a query for orders with a Freight value greater than 30.
Dim query = From cust In context.Customers _
    Where cust.Country = "Germany" _
    Select cust

Try
    ' Enumerate to execute the query.
    For Each cust As Customer In query
        Console.WriteLine("Name: {0}" & vbNewLine & "Address:" & vbNewLine & "{1}" _
                          & vbNewLine & "{2}, {3}", _
            cust.CompanyName, cust.Address, cust.City, cust.Region)
    Next
Catch ex As DataServiceQueryException
    Throw New ApplicationException( _
        "An error occurred during query execution.", ex)
End Try
// Create the DataServiceContext using the service URI.
NorthwindEntities context = new NorthwindEntities(svcUri);

// Register to handle the SendingRequest event.
// Note: If this must be done for every request to the data service, consider
// registering for this event by overriding the OnContextCreated partial method in 
// the entity container, in this case NorthwindEntities. 
context.SendingRequest += new EventHandler<SendingRequestEventArgs>(OnSendingRequest);

// Define a query for orders with a Freight value greater than 30.
var query = from cust in context.Customers
    where cust.Country == "Germany"
    select cust;

try
{
    // Enumerate to execute the query.
    foreach (Customer cust in query)
    {
        Console.WriteLine("Name: {0}\nAddress:\n{1}\n{2}, {3}",
            cust.CompanyName, cust.Address, cust.City, cust.Region);
    }
}
catch (DataServiceQueryException ex)
{
    throw new ApplicationException(
        "An error occurred during query execution.", ex);
}

El siguiente método controla el evento SendingRequest y agrega un encabezado de autenticación a la solicitud.

Private Shared Sub OnSendingRequest(ByVal sender As Object, ByVal e As SendingRequestEventArgs)
    ' Add an Authorization header that contains an OAuth WRAP access token to the request.
    e.RequestHeaders.Add("Authorization", "WRAP access_token=""123456789""")
End Sub
private static void OnSendingRequest(object sender, SendingRequestEventArgs e)
{
    // Add an Authorization header that contains an OAuth WRAP access token to the request.
    e.RequestHeaders.Add("Authorization", "WRAP access_token=\"123456789\"");
}

Vea también

Conceptos

Proteger WCF Data Services

Otros recursos

Cliente de datos (WCF Data Services)