Aracılığıyla paylaş


Arka plan hizmetlerinde konak ASP.NET Core SignalR

Tarafından Dave Pringle ve Brady Gaster

Bu makalede şunlara yönelik yönergeler sağlanır:

  • ASP.NET Core ile barındırılan bir arka plan çalışanı işlemi kullanarak Hub'ları barındırma SignalR .
  • .NET Core BackgroundService içinden bağlı istemcilere ileti gönderme.

Örnek kodu görüntüleme veya indirme (nasıl indirilir)

Uygulama başlangıcında etkinleştir SignalR

ASP.NET Core SignalR Hubs'ı arka plan çalışanı işlemi bağlamında barındırmak, ASP.NET Core web uygulamasında hub barındırmayla aynıdır. içinde Program.csçağrısı builder.Services.AddSignalR , desteklemek SignalRiçin gerekli hizmetleri ASP.NET Çekirdek Bağımlılık Ekleme (DI) katmanına ekler. MapHub yöntemi, ASP.NET Core istek işlem hattındaki Hub uç noktalarını bağlamak için üzerinde çağrılırWebApplicationapp.

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddSignalR();
builder.Services.AddHostedService<Worker>();

var app = builder.Build();

app.MapHub<ClockHub>("/hubs/clock");

app.Run();

Yukarıdaki örnekte sınıfı, ClockHub kesin olarak türü belirlenmiş bir Hub oluşturmak için sınıfını Hub<T> uygular. ClockHub, uç noktasındaki /hubs/clockisteklere yanıt verecek şekilde yapılandırılmıştırProgram.cs.

Kesin olarak yazılan Hub'lar hakkında daha fazla bilgi için bkz. ASP.NET Core için hub'ları SignalR kullanma.

Dekont

Bu işlev Hub<T> sınıfıyla sınırlı değildir. DynamicHub gibi Hub'dan devralan tüm sınıflar çalışır.

public class ClockHub : Hub<IClock>
{
    public async Task SendTimeToClients(DateTime dateTime)
    {
        await Clients.All.ShowTime(dateTime);
    }
}

Kesin olarak yazılan ClockHub tarafından kullanılan arabirim, arabirimdir IClock .

public interface IClock
{
    Task ShowTime(DateTime currentTime);
}

SignalR Arka plan hizmetinden Hub çağırma

Başlatma Worker sırasında sınıfı, BackgroundServicekullanılarak AddHostedServiceetkinleştirilir.

builder.Services.AddHostedService<Worker>();

SignalR Her Hub'ın ASP.NET Core'un HTTP istek işlem hattındaki tek bir uç noktaya eklendiği başlangıç aşamasında da etkinleştirildiğinden, her Hub sunucudaki bir IHubContext<T> ile temsil edilir. ASP.NET Core'un DI özelliklerini kullanarak, sınıflar, MVC Denetleyicisi sınıfları veya Razor sayfa modelleri gibi BackgroundService barındırma katmanı tarafından oluşturulan diğer sınıflar, oluşturma sırasında örneklerini kabul ederek sunucu tarafı Hub'lara IHubContext<ClockHub, IClock> başvurular alabilir.

public class Worker : BackgroundService
{
    private readonly ILogger<Worker> _logger;
    private readonly IHubContext<ClockHub, IClock> _clockHub;

    public Worker(ILogger<Worker> logger, IHubContext<ClockHub, IClock> clockHub)
    {
        _logger = logger;
        _clockHub = clockHub;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            _logger.LogInformation("Worker running at: {Time}", DateTime.Now);
            await _clockHub.Clients.All.ShowTime(DateTime.Now);
            await Task.Delay(1000, stoppingToken);
        }
    }
}

ExecuteAsync yöntemi arka plan hizmetinde yinelemeli olarak çağrıldığı için, sunucunun geçerli tarih ve saati kullanılarak ClockHubbağlı istemcilere gönderilir.

Arka plan hizmetleriyle olaylara tepki verme SignalR

için SignalRJavaScript istemcisini kullanan tek sayfalı bir uygulama veya ASP.NET Core SignalR .NET İstemcisi kullanan bir .NET masaüstü uygulaması gibi, BackgroundService hub'lara SignalR bağlanmak ve olaylara yanıt vermek için bir veya IHostedService uygulaması da kullanılabilir.

ClockHubClient sınıfı hem arabirimini IClock hem de arabirimini IHostedService uygular. Bu şekilde, başlatma sırasında sürekli çalışmak ve sunucudan Hub olaylarına yanıt vermek için etkinleştirilebilir.

public partial class ClockHubClient : IClock, IHostedService
{
}

başlatma ClockHubClient sırasında bir örneği HubConnection oluşturur ve hub'ın ShowTime olayının IClock.ShowTime işleyicisi olarak yöntemini etkinleştirir.

private readonly ILogger<ClockHubClient> _logger;
private HubConnection _connection;

public ClockHubClient(ILogger<ClockHubClient> logger)
{
    _logger = logger;
    
    _connection = new HubConnectionBuilder()
        .WithUrl(Strings.HubUrl)
        .Build();

    _connection.On<DateTime>(Strings.Events.TimeSent, ShowTime);
}

public Task ShowTime(DateTime currentTime)
{
    _logger.LogInformation("{CurrentTime}", currentTime.ToShortTimeString());

    return Task.CompletedTask;
}

IHostedService.StartAsync Uygulamada, HubConnection zaman uyumsuz olarak başlatılır.

public async Task StartAsync(CancellationToken cancellationToken)
{
    // Loop is here to wait until the server is running
    while (true)
    {
        try
        {
            await _connection.StartAsync(cancellationToken);

            break;
        }
        catch
        {
            await Task.Delay(1000, cancellationToken);
        }
    }
}

IHostedService.StopAsync yöntemi sırasında, HubConnection zaman uyumsuz olarak atılır.

public async Task StopAsync(CancellationToken cancellationToken)
{
    await _connection.DisposeAsync();
}

Örnek kodu görüntüleme veya indirme (nasıl indirilir)

Başlangıçta etkinleştir SignalR

ASP.NET Core SignalR Hubs'ı arka plan çalışanı işlemi bağlamında barındırmak, ASP.NET Core web uygulamasında hub barındırmayla aynıdır. yönteminde Startup.ConfigureServices çağrısı services.AddSignalR , desteklemek SignalRiçin gerekli hizmetleri ASP.NET Çekirdek Bağımlılık Ekleme (DI) katmanına ekler. MapHub içinde Startup.Configureyöntemi, ASP.NET Core istek işlem hattındaki Hub uç noktalarını bağlamak için geri çağırmada çağrılırUseEndpoints.

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddSignalR();
        services.AddHostedService<Worker>();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseRouting();
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapHub<ClockHub>("/hubs/clock");
        });
    }
}

Yukarıdaki örnekte sınıfı, ClockHub kesin olarak türü belirlenmiş bir Hub oluşturmak için sınıfını Hub<T> uygular. ClockHub, sınıfında uç noktasındaki Startup/hubs/clockisteklere yanıt verecek şekilde yapılandırıldı.

Kesin olarak yazılan Hub'lar hakkında daha fazla bilgi için bkz. ASP.NET Core için hub'ları SignalR kullanma.

Dekont

Bu işlev Hub<T> sınıfıyla sınırlı değildir. DynamicHub gibi Hub'dan devralan tüm sınıflar çalışır.

public class ClockHub : Hub<IClock>
{
    public async Task SendTimeToClients(DateTime dateTime)
    {
        await Clients.All.ShowTime(dateTime);
    }
}

Kesin olarak yazılan ClockHub tarafından kullanılan arabirim, arabirimdir IClock .

public interface IClock
{
    Task ShowTime(DateTime currentTime);
}

SignalR Arka plan hizmetinden Hub çağırma

Başlatma Worker sırasında sınıfı, BackgroundServicekullanılarak AddHostedServiceetkinleştirilir.

services.AddHostedService<Worker>();

SignalR Her Hub'ın ASP.NET Core'un HTTP istek işlem hattındaki tek bir uç noktaya eklendiği aşama sırasında Startup da etkinleştirildiğinden, her Hub sunucudaki bir IHubContext<T> ile temsil edilir. ASP.NET Core'un DI özelliklerini kullanarak, sınıflar, MVC Denetleyicisi sınıfları veya Razor sayfa modelleri gibi BackgroundService barındırma katmanı tarafından oluşturulan diğer sınıflar, oluşturma sırasında örneklerini kabul ederek sunucu tarafı Hub'lara IHubContext<ClockHub, IClock> başvurular alabilir.

public class Worker : BackgroundService
{
    private readonly ILogger<Worker> _logger;
    private readonly IHubContext<ClockHub, IClock> _clockHub;

    public Worker(ILogger<Worker> logger, IHubContext<ClockHub, IClock> clockHub)
    {
        _logger = logger;
        _clockHub = clockHub;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            _logger.LogInformation("Worker running at: {Time}", DateTime.Now);
            await _clockHub.Clients.All.ShowTime(DateTime.Now);
            await Task.Delay(1000);
        }
    }
}

ExecuteAsync yöntemi arka plan hizmetinde yinelemeli olarak çağrıldığı için, sunucunun geçerli tarih ve saati kullanılarak ClockHubbağlı istemcilere gönderilir.

Arka plan hizmetleriyle olaylara tepki verme SignalR

için SignalRJavaScript istemcisini kullanan tek sayfalı bir uygulama veya ASP.NET Core SignalR .NET İstemcisi kullanan bir .NET masaüstü uygulaması gibi, BackgroundService hub'lara SignalR bağlanmak ve olaylara yanıt vermek için bir veya IHostedService uygulaması da kullanılabilir.

ClockHubClient sınıfı hem arabirimini IClock hem de arabirimini IHostedService uygular. Bu şekilde, sürekli olarak çalıştırmak ve sunucudan Hub olaylarına yanıt vermek için etkinleştirilebilir Startup .

public partial class ClockHubClient : IClock, IHostedService
{
}

başlatma ClockHubClient sırasında bir örneği HubConnection oluşturur ve hub'ın ShowTime olayının IClock.ShowTime işleyicisi olarak yöntemini etkinleştirir.

private readonly ILogger<ClockHubClient> _logger;
private HubConnection _connection;

public ClockHubClient(ILogger<ClockHubClient> logger)
{
    _logger = logger;
    
    _connection = new HubConnectionBuilder()
        .WithUrl(Strings.HubUrl)
        .Build();

    _connection.On<DateTime>(Strings.Events.TimeSent, ShowTime);
}

public Task ShowTime(DateTime currentTime)
{
    _logger.LogInformation("{CurrentTime}", currentTime.ToShortTimeString());

    return Task.CompletedTask;
}

IHostedService.StartAsync Uygulamada, HubConnection zaman uyumsuz olarak başlatılır.

public async Task StartAsync(CancellationToken cancellationToken)
{
    // Loop is here to wait until the server is running
    while (true)
    {
        try
        {
            await _connection.StartAsync(cancellationToken);

            break;
        }
        catch
        {
            await Task.Delay(1000);
        }
    }
}

IHostedService.StopAsync yöntemi sırasında, HubConnection zaman uyumsuz olarak atılır.

public Task StopAsync(CancellationToken cancellationToken)
{
    return _connection.DisposeAsync();
}

Örnek kodu görüntüleme veya indirme (nasıl indirilir)

Başlangıçta etkinleştir SignalR

ASP.NET Core SignalR Hubs'ı arka plan çalışanı işlemi bağlamında barındırmak, ASP.NET Core web uygulamasında hub barındırmayla aynıdır. yönteminde Startup.ConfigureServices çağrısı services.AddSignalR , desteklemek SignalRiçin gerekli hizmetleri ASP.NET Çekirdek Bağımlılık Ekleme (DI) katmanına ekler. UseSignalR içinde Startup.Configureyöntemi, ASP.NET Core istek işlem hattındaki Hub uç noktalarını bağlamak için çağrılır.

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddSignalR();
        services.AddHostedService<Worker>();
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseSignalR((routes) =>
        {
            routes.MapHub<ClockHub>("/hubs/clock");
        });
    }
}

Yukarıdaki örnekte sınıfı, ClockHub kesin olarak türü belirlenmiş bir Hub oluşturmak için sınıfını Hub<T> uygular. ClockHub, sınıfında uç noktasındaki Startup/hubs/clockisteklere yanıt verecek şekilde yapılandırıldı.

Kesin olarak yazılan Hub'lar hakkında daha fazla bilgi için bkz. ASP.NET Core için hub'ları SignalR kullanma.

Dekont

Bu işlev Hub<T> sınıfıyla sınırlı değildir. DynamicHub gibi Hub'dan devralan tüm sınıflar çalışır.

public class ClockHub : Hub<IClock>
{
    public async Task SendTimeToClients(DateTime dateTime)
    {
        await Clients.All.ShowTime(dateTime);
    }
}

Kesin olarak yazılan ClockHub tarafından kullanılan arabirim, arabirimdir IClock .

public interface IClock
{
    Task ShowTime(DateTime currentTime);
}

SignalR Arka plan hizmetinden Hub çağırma

Başlatma Worker sırasında sınıfı, BackgroundServicekullanılarak AddHostedServiceetkinleştirilir.

services.AddHostedService<Worker>();

SignalR Her Hub'ın ASP.NET Core'un HTTP istek işlem hattındaki tek bir uç noktaya eklendiği aşama sırasında Startup da etkinleştirildiğinden, her Hub sunucudaki bir IHubContext<T> ile temsil edilir. ASP.NET Core'un DI özelliklerini kullanarak, sınıflar, MVC Denetleyicisi sınıfları veya Razor sayfa modelleri gibi BackgroundService barındırma katmanı tarafından oluşturulan diğer sınıflar, oluşturma sırasında örneklerini kabul ederek sunucu tarafı Hub'lara IHubContext<ClockHub, IClock> başvurular alabilir.

public class Worker : BackgroundService
{
    private readonly ILogger<Worker> _logger;
    private readonly IHubContext<ClockHub, IClock> _clockHub;

    public Worker(ILogger<Worker> logger, IHubContext<ClockHub, IClock> clockHub)
    {
        _logger = logger;
        _clockHub = clockHub;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            _logger.LogInformation("Worker running at: {Time}", DateTime.Now);
            await _clockHub.Clients.All.ShowTime(DateTime.Now);
            await Task.Delay(1000);
        }
    }
}

ExecuteAsync yöntemi arka plan hizmetinde yinelemeli olarak çağrıldığı için, sunucunun geçerli tarih ve saati kullanılarak ClockHubbağlı istemcilere gönderilir.

Arka plan hizmetleriyle olaylara tepki verme SignalR

için SignalRJavaScript istemcisini kullanan tek sayfalı bir uygulama veya ASP.NET Core SignalR .NET İstemcisi kullanan bir .NET masaüstü uygulaması gibi, BackgroundService hub'lara SignalR bağlanmak ve olaylara yanıt vermek için bir veya IHostedService uygulaması da kullanılabilir.

ClockHubClient sınıfı hem arabirimini IClock hem de arabirimini IHostedService uygular. Bu şekilde, sürekli olarak çalıştırmak ve sunucudan Hub olaylarına yanıt vermek için etkinleştirilebilir Startup .

public partial class ClockHubClient : IClock, IHostedService
{
}

başlatma ClockHubClient sırasında bir örneği HubConnection oluşturur ve hub'ın ShowTime olayının IClock.ShowTime işleyicisi olarak yöntemini etkinleştirir.

private readonly ILogger<ClockHubClient> _logger;
private HubConnection _connection;

public ClockHubClient(ILogger<ClockHubClient> logger)
{
    _logger = logger;
    
    _connection = new HubConnectionBuilder()
        .WithUrl(Strings.HubUrl)
        .Build();

    _connection.On<DateTime>(Strings.Events.TimeSent, 
        dateTime => _ = ShowTime(dateTime));
}

public Task ShowTime(DateTime currentTime)
{
    _logger.LogInformation("{CurrentTime}", currentTime.ToShortTimeString());

    return Task.CompletedTask;
}

IHostedService.StartAsync Uygulamada, HubConnection zaman uyumsuz olarak başlatılır.

public async Task StartAsync(CancellationToken cancellationToken)
{
    // Loop is here to wait until the server is running
    while (true)
    {
        try
        {
            await _connection.StartAsync(cancellationToken);

            break;
        }
        catch
        {
            await Task.Delay(1000);
        }
    }
}

IHostedService.StopAsync yöntemi sırasında, HubConnection zaman uyumsuz olarak atılır.

public Task StopAsync(CancellationToken cancellationToken)
{
    return _connection.DisposeAsync();
}

Ek kaynaklar