public async Task DownloadFileFromStreamAsync(Stream source, string fileName, string contentType)
        {
            var module = await moduleTask.Value;

            using var streamRef = new DotNetStreamReference(source);
            await module.InvokeVoidAsync("downloadFileFromStream", fileName, contentType, streamRef);
        }
Пример #2
0
    public async Task <DotNetStreamReference> TryClaimPendingStream(long streamId)
    {
        AssertInitialized();
        AssertNotDisposed();

        DotNetStreamReference dotNetStreamReference = null;

        try
        {
            return(await Renderer.Dispatcher.InvokeAsync <DotNetStreamReference>(() =>
            {
                if (!JSRuntime.TryClaimPendingStreamForSending(streamId, out dotNetStreamReference))
                {
                    throw new InvalidOperationException($"The stream with ID {streamId} is not available. It may have timed out.");
                }

                return dotNetStreamReference;
            }));
        }
        catch (Exception ex)
        {
            // An error completing stream interop means that the user sent invalid data, a well-behaved
            // client won't do this.
            Log.SendDotNetStreamException(_logger, streamId, ex);
            await TryNotifyClientErrorAsync(Client, GetClientErrorMessage(ex, "Unable to locate .NET stream."));

            UnhandledException?.Invoke(this, new UnhandledExceptionEventArgs(ex, isTerminating: false));
            return(default);
        public void Write_WritesValidJson()
        {
            // Arrange
            var streamRef = new DotNetStreamReference(new MemoryStream());

            // Act
            var json = JsonSerializer.Serialize(streamRef, JsonSerializerOptions);

            // Assert
            Assert.Equal("{\"__dotNetStream\":1}", json);
        }
        public void Write_WritesMultipleValidJson()
        {
            // Arrange
            var streamRef = new DotNetStreamReference(new MemoryStream());

            // Act & Assert
            for (var i = 1; i <= 10; i++)
            {
                var json = JsonSerializer.Serialize(streamRef, JsonSerializerOptions);
                Assert.Equal($"{{\"__dotNetStream\":{i}}}", json);
            }
        }
Пример #5
0
    public void BeginTransmittingStream_MultipleStreams()
    {
        // Arrange
        var runtime   = new TestJSRuntime();
        var streamRef = new DotNetStreamReference(new MemoryStream());

        // Act & Assert
        for (var i = 1; i <= 10; i++)
        {
            Assert.Equal(i, runtime.BeginTransmittingStream(streamRef));
        }
    }
Пример #6
0
    public static DotNetStreamReference GetDotNetStreamReference()
    {
        var data = new byte[100000];

        for (var i = 0; i < data.Length; i++)
        {
            data[i] = (byte)(i % 256);
        }

        var dataStream = new MemoryStream(data);
        var streamRef  = new DotNetStreamReference(dataStream);

        return(streamRef);
    }
Пример #7
0
    public async Task <int> SendDotNetStreamAsync(DotNetStreamReference dotNetStreamReference, long streamId, byte[] buffer)
    {
        AssertInitialized();
        AssertNotDisposed();

        try
        {
            return(await Renderer.Dispatcher.InvokeAsync <int>(async() => await dotNetStreamReference.Stream.ReadAsync(buffer)));
        }
        catch (Exception ex)
        {
            // An error completing stream interop means that the user sent invalid data, a well-behaved
            // client won't do this.
            Log.SendDotNetStreamException(_logger, streamId, ex);
            await TryNotifyClientErrorAsync(Client, GetClientErrorMessage(ex, "Unable to send .NET stream."));

            UnhandledException?.Invoke(this, new UnhandledExceptionEventArgs(ex, isTerminating: false));
            return(0);
        }
    }
Пример #8
0
        internal static async Task TransmitStreamAsync(IJSRuntime runtime, long streamId, DotNetStreamReference dotNetStreamReference)
        {
            var buffer = ArrayPool <byte> .Shared.Rent(32 * 1024);

            try
            {
                int bytesRead;
                while ((bytesRead = await dotNetStreamReference.Stream.ReadAsync(buffer)) > 0)
                {
                    await runtime.InvokeVoidAsync("Blazor._internal.receiveDotNetDataStream", streamId, buffer, bytesRead, null);
                }

                // Notify client that the stream has completed
                await runtime.InvokeVoidAsync("Blazor._internal.receiveDotNetDataStream", streamId, Array.Empty <byte>(), 0, null);
            }
            catch (Exception ex)
            {
                try
                {
                    // Attempt to notify the client of the error.
                    await runtime.InvokeVoidAsync("Blazor._internal.receiveDotNetDataStream", streamId, Array.Empty <byte>(), 0, ex.Message);
                }
                catch
                {
                    // JS Interop encountered an issue, unable to send error message to JS.
                }

                throw;
            }
            finally
            {
                ArrayPool <byte> .Shared.Return(buffer, clearArray : true);

                if (!dotNetStreamReference.LeaveOpen)
                {
                    dotNetStreamReference.Stream?.Dispose();
                }
            }
        }