Hub dışından ileti gönderme
SignalR Hub, sunucuya bağlı istemcilere ileti göndermeye yönelik temel soyutlamadırSignalR. Hizmeti kullanarak IHubContext
uygulamanızdaki diğer yerlerden ileti göndermek de mümkündür. Bu makalede, bir SignalRIHubContext
hub dışından istemcilere bildirim göndermek için 'e nasıl erişilmesi açıklanır.
Not
IHubContext
, istemcilere bildirim göndermek içindir, üzerindeki Hub
yöntemleri çağırmak için kullanılmaz.
Örnek kodu görüntüleme veya indirme (indirme)
Örneğini alma IHubContext
ASP.NET Core'da SignalRbir örneğine IHubContext
bağımlılık ekleme yoluyla erişebilirsiniz. Örneğini IHubContext
bir denetleyiciye, ara yazılıma veya başka bir DI hizmetine ekleyebilirsiniz. İstemcilere ileti göndermek için örneğini kullanın.
Bir denetleyiciye örneğini IHubContext
ekleme
Bir örneğini IHubContext
oluşturucunuza ekleyerek bir denetleyiciye ekleyebilirsiniz:
public class HomeController : Controller
{
private readonly IHubContext<NotificationHub> _hubContext;
public HomeController(IHubContext<NotificationHub> hubContext)
{
_hubContext = hubContext;
}
}
örneğine IHubContext
erişimle, hub'ın kendisindeymiş gibi istemci yöntemlerini çağırın:
public async Task<IActionResult> Index()
{
await _hubContext.Clients.All.SendAsync("Notify", $"Home page loaded at: {DateTime.Now}");
return View();
}
Ara yazılımda örneğini IHubContext
alma
Ara yazılım işlem hattı içindekine IHubContext
şu şekilde erişin:
app.Use(async (context, next) =>
{
var hubContext = context.RequestServices
.GetRequiredService<IHubContext<ChatHub>>();
//...
if (next != null)
{
await next.Invoke();
}
});
Not
İstemci yöntemleri sınıfın dışından Hub
çağrıldığında çağrıyla ilişkilendirilmiş bir çağıran yoktur. Bu nedenle, , Caller
ve Others
özelliklerine ConnectionId
erişim yoktur.
Bir kullanıcıyı bağlantı kimliğine eşlemesi ve bu eşlemeyi kalıcı hale getirmek için gereken uygulamalar aşağıdakilerden birini yapabilir:
- Tek veya birden çok bağlantının grup olarak eşlemini devam ettirin. Daha fazla bilgi için bkz . 'deki SignalR gruplar.
- Tek bir hizmet aracılığıyla bağlantı ve kullanıcı bilgilerini koruyun. Daha fazla bilgi için bkz . Hub'a hizmet ekleme. Tekil hizmet, aşağıdakiler gibi herhangi bir depolama yöntemini kullanabilir:
- Bir sözlükte bellek içi depolama.
- Kalıcı dış depolama alanı. Örneğin, Azure.Data.Tables NuGet paketini kullanan bir veritabanı veya Azure Tablo depolama alanı.
- İstemciler arasında bağlantı kimliğini geçirin.
IHost'tan örneğini IHubContext
alma
Web ana bilgisayarından erişim IHubContext
, ASP.NET Core dışındaki alanlarla tümleştirme için yararlıdır, örneğin, üçüncü taraf bağımlılık ekleme çerçevelerini kullanma:
public class Program
{
public static void Main(string[] args)
{
var host = CreateHostBuilder(args).Build();
var hubContext = host.Services.GetService(typeof(IHubContext<ChatHub>));
host.Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder => {
webBuilder.UseStartup<Startup>();
});
}
Kesin türe sahip bir HubContext ekleme
Kesin türe sahip bir HubContext eklemek için Hub'ınızın öğesinden Hub<T>
devraldığından emin olun. yerine arabirimini IHubContext<THub, T>
IHubContext<THub>
kullanarak ekler.
public class ChatController : Controller
{
public IHubContext<ChatHub, IChatClient> _strongChatHubContext { get; }
public ChatController(IHubContext<ChatHub, IChatClient> chatHubContext)
{
_strongChatHubContext = chatHubContext;
}
public async Task SendMessage(string user, string message)
{
await _strongChatHubContext.Clients.All.ReceiveMessage(user, message);
}
}
Daha fazla bilgi için bkz . Kesin olarak yazılan hub'lar .
Genel kodda kullanma IHubContext
Eklenen IHubContext<THub>
bir örnek, genel Hub
bir tür belirtilmeden öğesine IHubContext
atanabilir.
class MyHub : Hub
{ }
class MyOtherHub : Hub
{ }
app.Use(async (context, next) =>
{
var myHubContext = context.RequestServices
.GetRequiredService<IHubContext<MyHub>>();
var myOtherHubContext = context.RequestServices
.GetRequiredService<IHubContext<MyOtherHub>>();
await CommonHubContextMethod((IHubContext)myHubContext);
await CommonHubContextMethod((IHubContext)myOtherHubContext);
await next.Invoke();
}
async Task CommonHubContextMethod(IHubContext context)
{
await context.Clients.All.SendAsync("clientMethod", new Args());
}
Bu, aşağıdaki durumlarda kullanışlıdır:
- Uygulamanın kullandığı belirli
Hub
türe başvurusu olmayan kitaplıklar yazma. - Genel olan ve birden çok farklı
Hub
uygulamaya uygulanabilen kod yazma
Ek kaynaklar
ASP.NET Core