メインコンテンツまでスキップ

メタデータとヘッダー

Unary サービスのリクエストとレスポンスにはメタデータを付加できます。メタデータは HTTP のヘッダーとして扱われ、クライアントとサーバーでそれぞれ設定と読み取りが可能です。メタデータは gRPC の Metadata クラスで表現されます。

これはヘッダー認証のような仕組みやバージョン情報など追加で必要な情報をリクエストやレスポンスに付加する際に役立ちます。

クライアント

リクエストにメタデータを付加する

リクエストにメタデータを付加するには MagicOnionClientWithHeaders メソッドを使用します。以下の例では、Metadata クラスを使用してリクエストに Authorization ヘッダーを付加しています。

var client = MagicOnionClient.Create<IGreeterService>(channel).WithHeaders(new Metadata
{ "authorization", "Bearer {token}" }
});

クライアント作成時に MagicOnionClientOptions クラスを渡すオーバーロードや MagicOnionClient.WithOptions メソッドなどで CallOptions を使用して設定できます。また、それ以外の方法として クライアントフィルター を使用することでリクエスト時にメタデータを設定できます。

レスポンスのメタデータを読み取る

UnaryResult 構造体の ResponseHeadersAsync プロパティを使用してメタデータを読み取れます。 ResponseHeadersAsync はサーバーが応答するまで待機します。

以下はレスポンスのメタデータを読み取る例です。

var client = MagicOnionClient.Create<IGreeterService>(channel);
var result = client.SayHelloAsync("Alice", 18);

var headers = await result.ResponseHeadersAsync;

サーバー

サーバーでもクライアントから受信したリクエストのメタデータを読み取ったり、レスポンスにメタデータを付加できます。

リクエストのメタデータを読み取る

ServiceContext クラスの CallContext.RequestHeaders プロパティを使用してリクエストのメタデータを読み取れます。

if (Context.CallContext.RequestHeaders.GetValue("authorization") is {} authorizationHeader)
{
...
}

レスポンスにメタデータを付加する

ServiceContext クラスの CallContext.WriteResponseHeadersAsync メソッドを使用してレスポンスにメタデータを付加できます。

Context.CallContext.WriteResponseHeadersAsync(new Metadata
{
{ "x-server-version", "1.0.0" }
});

他にも ASP.NET Core の標準的な方法として HttpContext から HTTP ヘッダーとして値をセットすることも可能です。

Context.CallContext.GetHttpContext().Response.Headers.TryAdd("x-server-version", "1.0.0");