我目前正面临着grpc-web和负载均衡器的问题。尝试从网关API调用grpc the服务时,会导致以下错误:
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标头。它们只是在某个地方被剥离了。如果fiddler正在运行,它们就会被添加(我假设是由fiddler添加的),并且请求实际上是有效的。但是如果fiddler没有运行,报头就不在那里,我就会得到上面的错误。(老实说,我不明白小提琴手的部分,我只是报告我所看到的)。
有人知道为什么会发生这种情况吗?是否有可能添加我试图使用grpc-web添加的标头?
发布于 2021-08-21 19:36:11
我对grpc-web了解不多,但是grpc-gateway在将HTTP请求转发到grpc服务器时,如果它们没有grpcmetadata前缀,就会剥离HTTP头
你可以看看这个问题的帖子https://github.com/grpc-ecosystem/grpc-gateway/issues/1244
https://stackoverflow.com/questions/68115522
复制相似问题