es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Puede el servidor gRPC devolver un Stream a Blazor Wasm en lugar de IAsyncEnumerable?

Necesito transmitir un archivo desde ASP.NET Core a Blazor WASM usando gRPC.

Me gustaría usar la nueva clase “DotNetStreamReference” agregada en net6 para permitir la transmisión directamente al disco usando “JSInterop” (ver https://learn.microsoft.com/en-us/aspnet/core/blazor/file-downloads?view=aspnetcore-6.0).

Ahora, el problema es: el método de transmisión de datos gRPC devuelve un “IAsyncEnumerable“, pero la clase “DotNetStreamReference” solo acepta un objeto “Stream” como entrada.

¿Hay alguna manera de convertir “IAsyncEnumerable<byte[]>” en un “Stream” o, eventualmente, devolver un “Stream” desde una llamada de gRPC?

Gracias.</byte[]>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Sí, hay una forma de convertir IAsyncEnumerable<byte[]> a un Stream. Puede crear un objeto Stream utilizando las clases PipeWriter y PipeReader proporcionadas por .NET Core. Aquí hay un ejemplo:

    public async Task<stream> GetFileAsStream()
    {
        var stream = new MemoryStream();
    
        using var pipe = new Pipe();
    
        Task.Run(async () =>
        {
            await foreach (var buffer in GetFileData())
            {
                await pipe.Writer.WriteAsync(buffer);
            }
    
            pipe.Writer.Complete();
        });
    
        await pipe.Reader.CopyToAsync(stream);
    
        stream.Seek(0, SeekOrigin.Begin);
    
        return stream;
    }
    
    private async IAsyncEnumerable<byte[]> GetFileData()
    {
        // Su método gRPC que devuelve un stream
        using var call = client.GetFileAsStream();
        var stream = call.ResponseStream;
    
        while (await stream.MoveNext())
        {
            var data = stream.Current;
            yield return data.ToByteArray();
        }
    }
    

    En el ejemplo anterior, el método GetFileAsStream recibe los datos de streaming de gRPC utilizando IAsyncEnumerable<byte[]> y los convierte en un objeto Stream utilizando las clases PipeWriter y PipeReader. Finalmente, devuelve el objeto Stream que se puede utilizar con la clase DotNetStreamReference en Blazor WASM.

    Tenga en cuenta que este es solo un ejemplo y es posible que deba ajustarlo para que se adapte a su caso de uso específico.</byte[]></byte[]></byte[]>

Comments are closed.