Читайте метаданные в grpc на стороне сервера C#

Я отправляю токен в метаданных со стороны клиента

      Channel channel = new Channel("127.0.0.1:50051", ChannelCredentials.Insecure);
  ItemQuery item = new ItemQuery() { Id = "abc" };
  var client = new MyService.MyServiceClient(channel);
  Metadata data = new Metadata
  {
    { "token", "Bearer xhrttt" }
  };
  var reply = client.GetItem(item, data);

Но не в состоянии найти способ получить его на стороне сервера, любая помощь приветствуется

ниже приведен пример того, как выглядит мой серверный код (я пробовал и другие способы)

public override Task<ItemResponse> GetItem(ItemQuery request , ServerCallContext context)
    {
        try
        {
            var a = context.RequestHeaders["token"]; // not working 
            ItemResponse itmRes = new ItemResponse();
            if (request.Id == "foo")
            {
                itmRes.Items.Add(new Item() { Id = "foo", Name = "foobar" });
            }
            return Task.FromResult(itmRes);
        }
        catch(Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }
        return null;
    }

2 ответа

Решение

Ниже приведен код для извлечения метаданных в C#

                Metadata.Entry metadataEntry = context.RequestHeaders.FirstOrDefault(m =>
            String.Equals(m.Key, "token", StringComparison.Ordinal));

            if (metadataEntry.Equals(default(Metadata.Entry)) || metadataEntry.Value == null)
            {
                return null;
            }
            Console.WriteLine("Token value is {0}", metadataEntry.Value);

для получения более подробной информации см. https://csharp.hotexamples.com/examples/Grpc.Core/ServerCallContext/-/php-servercallcontext-class-examples.html

Основываясь на этом туториале , этом и этом , можно резюмировать получение и настройку метаданных:

GreeterService.cs(GrpcGreeter.csproj)

      public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
{
    context.WriteResponseHeadersAsync(
        new Metadata() { { "server_header", "nice to see you too" } });

    context.ResponseTrailers.Add(
        new Metadata.Entry("server_trailer", "see you later") { });

    string? client_header = context.RequestHeaders.GetValue("client_header");
    return Task.FromResult(new HelloReply
    {
        Message = $"i got your header, {request.Name}. it reads: {client_header}"
    });
}

Program.cs(GrpcGreeterClient.csproj)

      // The port number must match the port of the gRPC server.
using var channel = GrpcChannel.ForAddress("https://localhost:7143");

Greeter.GreeterClient client = new Greeter.GreeterClient(channel);
var call = client.SayHelloAsync(
                new HelloRequest { Name = "GreeterClient" },
                new Metadata() { { "client_header", "hey there" } });

Metadata headers = await call.ResponseHeadersAsync;
Console.WriteLine($"Server Header: {headers.GetValue("server_header")}");

HelloReply rsp = await call.ResponseAsync;
Console.WriteLine($"Server Response: {rsp.Message}");

Metadata trailers = call.GetTrailers();
string? myTrailer = trailers.GetValue("server_trailer");
Console.WriteLine($"Server Trailers: {myTrailer}");

Выход:

      Server Header: nice to see you too
Server Response: i got your header, GreeterClient. it reads: hey there
Server Trailers: see you later
Другие вопросы по тегам