Getting Started With SignalR, .NET Core 2.1 And Angular

About 3 months ago I wrote a post with the steps to set up SignalR for a new .NET Core 2.0 app with Angular. I thought it was really amazing how easy it was, but now that .NET Core 2.1 is available, no messing up with non-default npm and nuget sources required. And also SignalR comes by default.

Make sure you have the latest .NET Core SDK installed

Getting started

  • dotnet new angular
  • cd ClientApp
  • npm install @aspnet/signalr

Creating new hub in the server side

This is like a controller in a MVC application which is responsible for interactions between the client and the server.

...
using Microsoft.AspNetCore.SignalR;

namespace SignalRDotNetCore21.Hubs
{
    public class EchoHub : Hub
    {
        //you're going to invoke this method from the client app
        public void Echo(string message)
        {
            //you're going to configure your client app to listen for this
            Clients.All.SendAsync("Send", message);
        }
    }
}

Wiring up the server side in the Startup

In the startup.cs there are really only two things to put together.

public void ConfigureServices(IServiceCollection services)
{
    ...
    services.AddSignalR();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    ...
    // If you're using the SPA template, this should come before app.UseSpa(...);
    app.UseSignalR(routes =>
    {
        routes.MapHub<EchoHub>("/hubs/echo");
    });
}

Wiring up client side

For testing purposes, I'm configuring the connection straight into the home component.

import { Component, OnInit } from '@angular/core';
import { HubConnection, HubConnectionBuilder } from '@aspnet/signalr';

@Component({
  selector: 'app-home',
  templateUrl: './home.component.html',
})
export class HomeComponent implements OnInit {

  public hubConnection: HubConnection;
  public messages: string[] = [];
  public message: string;

  ngOnInit() {
    let builder = new HubConnectionBuilder();
    
    // as per setup in the startup.cs
    this.hubConnection = builder.withUrl('/hubs/echo').build();

    // message coming from the server
    this.hubConnection.on("Send", (message) => {
      this.messages.push(message);
    });

    // starting the connection
    this.hubConnection.start();
  }

  send() {
    // message sent from the client to the server
    this.hubConnection.invoke("Echo", this.message);
    this.message = "";
  }
}

Updating the HTML to bind to component

<input type="text" [(ngModel)]="message">
<button (click)="send()">Send</button>
<p *ngFor="let m of messages">{{m}}</p>

And that's it!!!

Hope it helps.

Cheers.