WebSocketChannel 0.9.2

Install-Package WebSocketChannel -Version 0.9.2
dotnet add package WebSocketChannel --version 0.9.2
<PackageReference Include="WebSocketChannel" Version="0.9.2" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add WebSocketChannel --version 0.9.2
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
#r "nuget: WebSocketChannel, 0.9.2"
#r directive can be used in F# Interactive, C# scripting and .NET Interactive. Copy this into the interactive tool or source code of the script to reference the package.
// Install WebSocketChannel as a Cake Addin
#addin nuget:?package=WebSocketChannel&version=0.9.2

// Install WebSocketChannel as a Cake Tool
#tool nuget:?package=WebSocketChannel&version=0.9.2
The NuGet Team does not provide support for this client. Please contact its maintainers for support.

Version Downloads License Build

Usage

var client = new ClientWebSocket();
await client.ConnectAsync(serverUri, CancellationToken.None);

Channel<ReadOnlyMemory<byte>> channel = client.CreateChannel();

await channel.Writer.WriteAsync(Encoding.UTF8.GetBytes("hello").AsMemory());

// Read single message when it arrives
ReadOnlyMemory<byte> response = await channel.Reader.ReadAsync();

// Read all messages while underlying websocket is open
await foreach (var item in channel.Reader.ReadAllAsync())
{
    Console.WriteLine(Encoding.UTF8.GetString(item.Span));
}

// Completing the writer closes the underlying websocket cleanly
channel.Writer.Complete();

// Can also complete reporting an error for the remote party
channel.Writer.Complete(new InvalidOperationException("Bad format"));

The WebSocketChannel can also be used on the server. The following example is basically taken from the documentation on WebSockets in ASP.NET Core and adapted to use a WebSocketChannel to echo messages to the client:

app.Use(async (context, next) =>
{
    if (context.Request.Path == "/ws")
    {
        if (context.WebSockets.IsWebSocketRequest)
        {
            using var webSocket = await context.WebSockets.AcceptWebSocketAsync();
            var channel = WebSocketChannel.Create(webSocket);
            try
            {
                await foreach (var item in channel.Reader.ReadAllAsync(context.RequestAborted))
                {
                    await channel.Writer.WriteAsync(item, context.RequestAborted);
                }
            }
            catch (OperationCanceledException)
            {
                try
                {
                    await webSocket.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, null, default);
                }
                catch { } // Best effort to try closing cleanly. Client may be entirely gone.
            }
        }
        else
        {
            context.Response.StatusCode = (int) HttpStatusCode.BadRequest;
        }
    }
    else
    {
        await next();
    }
});

Installation

This project can be used either as a regular nuget package:

<PackageReference Include="WebSocketChannel" Version="*" />

Or alternatively, referenced directly as a source-only dependency using dotnet-file:

> dotnet file add https://github.com/devlooped/WebSocketChannel/blob/main/src/WebSocketChannel/WebSocketChannel.cs
> dotnet file add https://github.com/devlooped/WebSocketChannel/blob/main/src/WebSocketChannel/WebSocketExtensions.cs

It's also possible to specify a desired target location for the referenced source files, such as:

> dotnet file add https://github.com/devlooped/WebSocketChannel/blob/main/src/WebSocketChannel/WebSocketChannel.cs src/MyProject/External/.
> dotnet file add https://github.com/devlooped/WebSocketChannel/blob/main/src/WebSocketChannel/WebSocketExtensions.cs src/MyProject/External/.

When referenced as loose source files, it's easy to also get automated PRs when the upstream files change, as in the dotnet-file.yml workflow that keeps the repository up to date with a template. See also dotnet-config, which is used to for the dotnet-file configuration settings that tracks all this.

Sponsors

sponsored clariusclarius

get mentioned here too!

NuGet packages (1)

Showing the top 1 NuGet packages that depend on WebSocketChannel:

Package Downloads
WebSocketeer

A thin, intuitive, idiomatic and high-performance layer for Azure Web PubSub protobuf subprotocol. Built from https://github.com/devlooped/WebSocketeer/tree/c4da4fc4b

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
0.9.2 227 10/15/2021
0.9.1 186 10/4/2021
0.9.0 127 10/4/2021