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 Hubyö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 IHubContexteriş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, , Callerve Others özelliklerine ConnectionIderiş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