方法: クライアント要求のヘッダーを設定する (WCF Data Services)
WCF Data Services クライアント ライブラリを使用して、Open Data Protocol (OData) をサポートするデータ サービスにアクセスする場合、クライアント ライブラリにより、データ サービスに送信される要求メッセージに必要な HTTP ヘッダーが自動的に設定されます。 ただし、クライアント ライブラリでは、データ サービスがクレーム ベース認証やクッキーを要求する場合など、特定の場合に必要とされるメッセージ ヘッダーを設定することはできません。 詳細については、「Securing WCF Data Services」を参照してください。 このような場合は、要求メッセージを送信する前にそのメッセージ ヘッダーを手動で設定する必要があります。 このトピックの例では、SendingRequest イベントを処理して、要求メッセージをデータ サービスに送信する前に新しいヘッダーを要求メッセージに追加する方法を示します。
このトピックの例では、Northwind サンプル データ サービスおよび自動生成されたクライアント データ サービス クラスを使用します。 このサービスおよびクライアント データ クラスは、WCF Data Services クイック スタートを完了したときに作成されます。 OData Web サイトで公開されている Northwind サンプル データ サービスを使用することもできます。このサンプル データ サービスは読み取り専用で、変更を保存しようとするとエラーが返されます。 OData Web サイトのサンプル データ サービスでは、匿名認証が許可されます。
使用例
次の例では、SendingRequest イベントのハンドラーを登録し、データ サービスに対してクエリを実行します。
注意
要求ごとにメッセージ ヘッダーを手動で設定することがデータ サービスで必要とされる場合は、データ サービスを表すエンティティ コンテナー (この場合は NorthwindEntities) で OnContextCreated 部分メソッドをオーバーライドして、SendingRequest イベントのハンドラーを登録することを検討してください。
' 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);
}
次のメソッドは、SendingRequest イベントを処理し、認証ヘッダーを要求に追加します。
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\"");
}