问题描述
我不明白为什么只有在使用CompleteAsync()
时才会出现响应。
using var call = _apiclient.GetToken(headers: _threadcontext.Metadata,deadline: DateTime.UtcNow.AddSeconds(5));
var keyReq = new GetTokenRequest()
{
Key = publicKey
};
var readTask = Task.Run(async () =>
{
await foreach(var message in call.ResponseStream.ReadAllAsync())
{
if (message.Challenge != null)
{
var challenge = message.Challenge.ToByteArray();
var signature = await VerifySignature(challenge);
var signReq = new GetTokenRequest
{
Signature = ByteString.copyFrom(signature)
};
await call.RequestStream.WriteAsync(signReq);
await call.RequestStream.CompleteAsync();
}
else if (message.Token != null)
{
token = message.Token;
}
}
});
await call.RequestStream.WriteAsync(keyReq);
await readTask;
如果以此结尾更改,我会收到消息,但是在响应中,下一个WriteAsync
会失败,因为流已关闭。
await call.RequestStream.WriteAsync(keyReq);
await call.RequestStream.CompleteAsync();
await readTask;
如果我没有完成请求,则永远不会出现响应消息。
有什么主意吗?
注意:服务器在运行中。
解决方法
此代码仅不适用于Grpc.Net.Client.Web。使用经典的SocketHttpHandler可以。问题解决了。谢谢。