I don't understand why the response comes only if I use 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;
If I change the end with this, I receive messages but in the response the next WriteAsync fails because the stream is closed.
await call.RequestStream.WriteAsync(keyReq);
await call.RequestStream.CompleteAsync();
await readTask;
And if I doesn't complete the request, response message never comes.
Any idea ?
Note: the server is in go.
 
    