【问题标题】:Add metadata for all calls to gRPC service为所有对 gRPC 服务的调用添加元数据
【发布时间】:2020-12-09 15:43:45
【问题描述】:

如何为服务的所有调用添加元数据?我知道如何为特定呼叫发送元数据,但我似乎找不到如何为所有呼叫添加标准元数据。

我尝试使用客户端拦截器在此处添加元数据,但我似乎无法在此处操作上下文的标头。

我在 .net 框架中使用 gRPC,而不是 .net 核心。

【问题讨论】:

    标签: c# .net grpc


    【解决方案1】:

    如果这是一个 client 调用(而不是服务器调用),您应该能够通过覆盖客户端调用在拦截器中执行此操作 - 例如:

    public override AsyncClientStreamingCall<TRequest, TResponse> AsyncClientStreamingCall<TRequest, TResponse>(ClientInterceptorContext<TRequest, TResponse> context, AsyncClientStreamingCallContinuation<TRequest, TResponse> continuation)
    {
        Metadata newMetadata = // your logic here
        context = new ClientInterceptorContext<TRequest, TResponse>(context.Method,
            context.Host, context.Options.WithHeaders(newMetadata));
        return base.AsyncClientStreamingCall(context, continuation);
    }
    

    (您需要覆盖所有 5 个客户端调用方法;​​AsyncClientStreamingCallAsyncDuplexStreamingCallAsyncServerStreamingCallAsyncUnaryCallBlockingUnaryCall

    【讨论】:

    • 感谢您的快速回复。我设法错过了 WithHeaders 方法 :) 这很有效,我从没想过必须用新的上下文覆盖整个上下文。
    • 我也很难为 grpc 找到任何可以解释拦截器、元数据等内容的好的文档,在我放弃并来到这里之前,我尝试了很长时间来找到这个答案。您可能拥有的任何资源将不胜感激。
    • @schh 我同意,有些部分的文档记录很差。我维护 protobuf-net.Grpc,它通过构建在 Google/Microsoft 位之上,在 .NET 中启用代码优先 gRPC 场景,因此我必须深入挖掘才能找到东西。如果您有任何具体问题,我可能会提供帮助 - 但我不能保证提供开放式文档来源:/
    • 哦,太好了 :) 那太棒了,我正在从 wcf 迁移到 grpc atm,所以我肯定在某些时候会有一些问题,到目前为止,它很容易得到东西工作,只是其中一些我遇到了问题。在我来找你之前,我会努力研究。感谢提供,非常感谢。
    • @schh 可能为时已晚,但这可能有用:github.com/protobuf-net/protobuf-net.Grpc/tree/main/examples/…
    猜你喜欢
    • 2016-09-28
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    • 2022-12-01
    • 2020-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多