【问题标题】:Set headers for grpc-web call设置 grpc-web 调用的标头
【发布时间】:2021-06-24 12:10:28
【问题描述】:

我目前面临 grpc-web 和负载平衡器的问题。 尝试从我们的网关 API 调用我们的 grpc 网络服务,会导致以下错误:

Status(StatusCode="Unknown", Detail="Bad gRPC response. HTTP status code: 411")

似乎需要以下任何一个标头,content-length 或 Transfer-Encoding。

我有一种在客户端中设置元数据的方法。

private async Task<Metadata> SetMetadata()
    {
        //More stuff here
        
        headers.Add("Transfer-Encoding", "chunked");

        return headers;
    }

这是我创建客户的方式:

private async Task<Services.Protobuf.ServiceClient> CreateClient()
    {

        var httpMessageHandler = new HttpClientHandler();

        _grpcChannel ??= GrpcChannel.ForAddress(
            await _serviceAddressProvider.GetServiceAddress<ServiceClient>() ??
            throw new InvalidOperationException(),
            new GrpcChannelOptions()
            {
                HttpHandler = new GrpcWebHandler(httpMessageHandler)
            });
        return new(_grpcChannel);
    }

这就是我如何使用这两个

 var serviceClient = await CreateClient();
 var request = new Request
 {
     //Request stuff
 };
 var getListReply = await serviceClient.GetListReplyAsync(request, await SetMetadata());

现在。问题是我无法设置 Transfer-Encoding 或 Content-Lenght 标头。他们只是在某处被剥夺。 如果提琴手正在运行,它们会被添加(我假设是提琴手),并且请求实际上有效。但如果提琴手没有运行,标题不存在,我得到上述错误。 (老实说,我不了解提琴手的部分,我只是报告我所看到的)。

有人知道为什么会这样吗?如果甚至可以添加我尝试使用 grpc-web 添加的标头?

【问题讨论】:

    标签: grpc grpc-web grpc-dotnet


    【解决方案1】:

    我对 grpc-web 了解不多,但 grpc-gateway 在将 HTTP 请求转发到 grpc 服务器时,如果它们没有 grpcmetadata 前缀,它会去除 HTTP 标头

    你可以看看这个问题线程https://github.com/grpc-ecosystem/grpc-gateway/issues/1244

    【讨论】:

      猜你喜欢
      • 2020-12-26
      • 1970-01-01
      • 2020-01-15
      • 1970-01-01
      • 2021-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-19
      相关资源
      最近更新 更多