abhi
abhi

Reputation: 1084

Read metadata in grpc on the server side c#

I am sending token in metadata from the client side

      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);

But not able to find a way to fetch it in server side, Any help is appreciated

below is an example of how my server-side code looks(i tried certain other ways also)

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;
    }

Upvotes: 5

Views: 6594

Answers (2)

Hung P.T.
Hung P.T.

Reputation: 141

Based on this tutorial, this and this, getting and setting metadata can be summarized:

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}");

Output:

Server Header: nice to see you too
Server Response: i got your header, GreeterClient. it reads: hey there
Server Trailers: see you later

Upvotes: 0

abhi
abhi

Reputation: 1084

Below is the code to fetch metadata in 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);

for more details refer https://csharp.hotexamples.com/examples/Grpc.Core/ServerCallContext/-/php-servercallcontext-class-examples.html

Upvotes: 4

Related Questions