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 (indirme)
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ır WebApplication
app
.
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/clock
isteklere 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.
Not
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ı, BackgroundService
kullanılarak AddHostedService
etkinleş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 ClockHub
bağ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 (indirme)
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.Configure
yö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/clock
isteklere 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.
Not
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ı, BackgroundService
kullanılarak AddHostedService
etkinleş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 ClockHub
bağ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 (indirme)
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.Configure
yö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/clock
isteklere 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.
Not
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ı, BackgroundService
kullanılarak AddHostedService
etkinleş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 ClockHub
bağ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
ASP.NET Core