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 makale, hub dışından istemcilere bildirim göndermek için bir SignalRIHubContext öğesine nasıl erişeceğinizi açıklar.

Note

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)

IHubContext örneğini alın

ASP.NET Core'da, bağımlılık enjeksiyonu aracılığıyla IHubContext örneğine erişebilirsiniz. IHubContext örneğini bir denetleyiciye, ara katmana veya başka bir DI hizmetine enjekte edebilirsiniz. İstemcilere ileti göndermek için örneğini kullanın.

Bir denetleyiciye IHubContext örneği enjekte etme

IHubContext örneğini, oluşturucunuza ekleyerek bir denetleyiciye enjekte edebilirsiniz:

public class HomeController : Controller
{
    private readonly IHubContext<NotificationHub> _hubContext;

    public HomeController(IHubContext<NotificationHub> hubContext)
    {
        _hubContext = hubContext;
    }
}

IHubContext örneğine erişiminiz olduğunda, hub’ın içindeymişsiniz 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 IHubContext örneğini alın

Ara yazılım işlem hattı içinde IHubContext öğesine şu şekilde erişin:

app.Use(async (context, next) =>
{
    var hubContext = context.RequestServices
                            .GetRequiredService<IHubContext<ChatHub>>();
    //...
    
    if (next != null)
    {
        await next.Invoke();
    }
});

Note

İstemci yöntemleri Hub sınıfının dışından çağrıldığında, çağrıyla ilişkili bir çağıran yoktur. Bu nedenle, , ConnectionIdve Caller özelliklerine Otherseriş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 SignalR içindeki Gruplar bölümüne bakın.
  • Tek bir hizmet aracılığıyla bağlantı ve kullanıcı bilgilerini koruyun. Daha fazla bilgi için bir hub'a hizmet ekleme bölümüne bakın. Singleton 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ı.
  • Bağlantı kimliğini istemciler arasında aktarın.

IHost'tan IHubContext örneği alma

Web ana bilgisayarından bir IHubContext öğesine erişmek, ASP.NET Core dışındaki alanlarla tümleştirme için yararlıdır; örneğin, üçüncü taraf bağımlılık enjeksiyonu çerçevelerini kullanırken:

    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>();
                });
    }

Güçlü tür tanımlı bir HubContext ekleyin

Kesin türe sahip bir HubContext eklemek için Hub'ınızın öğesinden Hub<T>devraldığından emin olun. Onu IHubContext<THub> yerine IHubContext<THub, T> arabirimini kullanarak ekleyin.

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ı kullanma .

Genel kodda IHubContext kullanın

Enjekte edilen bir IHubContext<THub> örneği, genel bir Hub türü belirtilmeden IHubContext öğesine dönüştürülebilir.

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ürüne başvurmayan kitaplıklar yazma.
  • Genel olan ve birden çok farklı Hub uygulamaya uygulanabilen kod yazma

Ek kaynaklar