我目前面临 grpc-web 和负载均衡器的问题。尝试从我们的网关 API 调用我们的 grpc 网络服务,会导致以下错误:
Status(StatusCode="Unknown", Detail="Bad gRPC response. HTTP status code: 411")
似乎需要以下任一标头,内容长度或传输编码。
我有一种在客户端中设置元数据的方法。
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 添加的标头?