Vorgehensweise: Festlegen von Headern in der Clientanforderung (WCF Data Services)
Wenn Sie mithilfe der WCF Data Services -Clientbibliothek auf einen Datendienst zugreifen, der das Open Data Protocol (OData) unterstützt, legt die Clientbibliothek die erforderlichen HTTP-Header in Anforderungsnachrichten an den Datendienst automatisch fest. Die Clientbibliothek ist jedoch nicht in der Lage, Nachrichtenheader festzulegen, die in bestimmten Fällen erforderlich sind, z. B. wenn der Datendienst die anspruchsbasierte Authentifizierung oder Cookies erfordert. Weitere Informationen finden Sie unter Securing WCF Data Services. In diesen Fällen müssen Sie Nachrichtenheader in der Anforderungsnachricht vor dem Senden manuell festlegen. Das Beispiel in diesem Thema zeigt, wie das SendingRequest-Ereignis behandelt wird, um der Anforderungsnachricht einen neuen Header hinzuzufügen, bevor sie an den Datendienst gesendet wird.
Im Beispiel in diesem Thema werden der Northwind-Beispieldatendienst und automatisch generierte Client-Datendienstklassen verwendet. Dieser Dienst und die Clientdatenklassen werden erstellt, wenn Sie den WCF Data Services-Schnellstart ausführen. Sie können auch den auf der OData -Website veröffentlichten Northwind-Beispieldatendienst verwenden. Dieser Beispieldatendienst ist schreibgeschützt. Wenn Sie versuchen, Änderungen zu speichern, wird ein Fehler zurückgegeben. Die Beispieldatendienste auf der OData -Website lassen die anonyme Authentifizierung zu.
Beispiel
Im folgenden Beispiel wird ein Handler für das SendingRequest-Ereignis registriert und anschließend eine Abfrage für den Datendienst ausgeführt.
Hinweis: |
---|
Wenn Sie bei einem Datendienst den Nachrichtenheader für jede Anforderung manuell festlegen müssen, ist es u. U. sinnvoll, den Handler für das SendingRequest-Ereignis durch Überschreiben der partiellen OnContextCreated-Methode im Entitätscontainer, der den Datendienst darstellt (in diesem Fall NorthwindEntities), zu registrieren. |
' 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}\nAddress:\n{1}\n{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);
}
Die folgende Methode behandelt das SendingRequest-Ereignis und fügt der Anforderung einen Authentifizierungsheader hinzu.
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\"");
}