In .NET 9 I've created a default Blazor Web app project and added a SignalR hub that is used for sending notifications between clients.
When one session increments the value for /counter, all sessions are notified of this and updates their displayed value. This all works.
What I don't understand is why in the browser developer tools, there's no connection to the configured Hub URL. There is only the standard Blazor server websocket to /_blazor.
The code-behind for Counter.razor is updated like this:
<PageTitle>Counter</PageTitle><h1>Counter</h1><p role="status">Current count: @currentCount</p><button class="btn btn-primary" @onclick="IncrementCount">Click me</button>@code { private int currentCount = 0; private HubConnection _hubConnection; public async ValueTask DisposeAsync() { await _hubConnection.DisposeAsync(); } protected override async Task OnInitializedAsync() { _hubConnection = new HubConnectionBuilder() .WithUrl(NavigationManager.ToAbsoluteUri(CounterHub.HubUrl)) .Build(); _hubConnection.On<CounterNotification>(CounterHub.CounterUpdatedMethod, HandleCounterUpdated); await _hubConnection.StartAsync(); } private void HandleCounterUpdated(CounterNotification notification) { currentCount = notification.Counter; InvokeAsync(StateHasChanged); } private async Task IncrementCount() { await CounterHubContext.Clients.All.SendAsync(CounterHub.CounterUpdatedMethod, new CounterNotification(currentCount + 1)); }}CounterHub.cs is implemented like this:
public class CounterHub : Hub{ public const string HubUrl = "/counter-notifications"; public const string CounterUpdatedMethod = "CounterUpdated"; public override Task OnConnectedAsync() { Console.WriteLine("{0} connected", Context.ConnectionId); return base.OnConnectedAsync(); } public override async Task OnDisconnectedAsync(Exception? e) { Console.WriteLine("{0} disconnected", Context.ConnectionId); await base.OnDisconnectedAsync(e); }}CounterNotification.cs looks like this:
public record CounterNotification(int Counter){ public CounterNotification() : this(0) { }}It's all hooked up in Program.cs with the additions of these lines:
builder.Services.AddSignalR();builder.Services.AddResponseCompression(opts =>{ opts.MimeTypes = ResponseCompressionDefaults.MimeTypes.Concat( ["application/octet-stream"]);});app.UseResponseCompression();app.MapHub<CounterHub>(CounterHub.HubUrl);With this, I would expect to see a websocket open up to /counter-notifications. But there's nothing. What's going on? Is the default Blazor websocket connection reused for the custom SignalR?
