为什么双向流一直阻塞直到CompleteAsync

问题描述

我不明白为什么只有在使用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可以。问题解决了。谢谢。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...