Hub'ları SignalR ASP.NET Core

GöreCe Appel veİslaLide

Örnek kodu görüntüleme veya indirme (indirme)

Merkez SignalR nedir?

SignalRHubs API'si, sunucudan bağlı istemcilerde yöntemleri çağırmaya olanak sağlar. Sunucu kodunda, istemci tarafından çağrılan yöntemleri tanımlarsınız. İstemci kodunda, sunucudan çağrılan yöntemleri tanımlarsınız. SignalR gerçek zamanlı istemciden sunucuya ve sunucudan istemciye iletişimleri mümkün kılan her şeyi arkalarında yapar.

SignalRHub'ları yapılandırma

Ara SignalR yazılım, çağrılarak yapılandırılan bazı hizmetler services.AddSignalR gerektirir.

services.AddSignalR();

Bir SignalR uygulamanın ASP.NET Core eklerken, SignalR yöntemin geri aramasını endpoint.MapHub Startup.Configure çağırarak app.UseEndpoints yolları ayarlama.

app.UseRouting();
app.UseEndpoints(endpoints =>
{
    endpoints.MapHub<ChatHub>("/chathub");
});

Bir SignalR uygulamanın ASP.NET Core eklerken, yöntemini SignalR çağırarak app.UseSignalR yolları Startup.Configure ayarlama.

app.UseSignalR(route =>
{
    route.MapHub<ChatHub>("/chathub");
});

Hub'ları oluşturma ve kullanma

'den devralan bir sınıf bildirerek bir hub oluşturun Hub ve buna genel yöntemler ekleyin. İstemciler olarak tanımlanan yöntemleri public çağırarak.

public class ChatHub : Hub
{
    public Task SendMessage(string user, string message)
    {
        return Clients.All.SendAsync("ReceiveMessage", user, message);
    }
}

Herhangi bir C# yönteminde olduğu gibi, karmaşık türler ve diziler de dahil olmak üzere bir dönüş türü ve parametreler belirtebilirsiniz. SignalR parametrelerinizin ve dönüş değerlerinizin karmaşık nesneleri ve dizilerinin serileştirme ve seriden kaldıran işleme.

Not

Hub'lar geçicidir:

  • Durumu hub sınıfındaki bir özellikte depolamayın. Her hub yöntemi çağrısı yeni bir hub örneğinde yürütülür.
  • awaitHub'ın canlı kalma durumuna bağlı olan zaman uyumsuz yöntemleri çağırarak kullanın. Örneğin, olmadan çağrılsa ve hub yöntemi bitmeden önce tamamlanırsa gibi bir yöntem Clients.All.SendAsync(...) await başarısız SendAsync olabilir.

Bağlam nesnesi

sınıfı, Hub bağlantı hakkında bilgi içeren aşağıdaki özellikleri içeren bir Context özelliğine sahiptir:

Özellik Açıklama
ConnectionId tarafından atanan bağlantının benzersiz kimliğini SignalR alır. Her bağlantı için bir bağlantı kimliği vardır.
UserIdentifier Kullanıcı tanımlayıcısını alır. Varsayılan olarak, SignalR kullanıcı ClaimTypes.NameIdentifier tanımlayıcısı olarak ClaimsPrincipal bağlantıyla ilişkili 'den kullanır.
User Geçerli ClaimsPrincipal kullanıcıyla ilişkili olan 'i alır.
Items Bu bağlantı kapsamında veri paylaşmak için kullanılan bir anahtar/değer koleksiyonu alır. Veriler bu koleksiyonda depolanmış olabilir ve farklı hub yöntemi çağrılarında bağlantı için kalıcı olur.
Features Bağlantıda kullanılabilen özelliklerin koleksiyonunu alır. Şimdilik bu koleksiyon çoğu senaryoda gerekli değildir, bu nedenle henüz ayrıntılı olarak belgelenmiş değildir.
ConnectionAborted Bağlantı CancellationToken durdurularak bunu iletir.

Hub.Context ayrıca aşağıdaki yöntemleri içerir:

Yöntem Açıklama
GetHttpContext Bağlantı HttpContext için veya bağlantı bir null HTTP isteğiyle ilişkili değilse döndürür. HTTP bağlantıları için, HTTP üst bilgileri ve sorgu dizeleri gibi bilgileri almak için bu yöntemi kullanabilirsiniz.
Abort Bağlantıyı iptal eder.

İstemciler nesnesi

sınıfı, Hub sunucu ve istemci arasındaki iletişim için aşağıdaki özellikleri içeren bir Clients özelliğine sahiptir:

Özellik Açıklama
All Tüm bağlı istemcilere bir yöntem çağrır
Caller İstemcide hub yöntemini çağıran bir yöntem çağırır
Others yöntemini çağıran istemci dışında tüm bağlı istemcilere bir yöntem çağırır

Hub.Clients ayrıca aşağıdaki yöntemleri içerir:

Yöntem Açıklama
AllExcept Belirtilen bağlantılar dışında tüm bağlı istemcilere bir yöntem çağrır
Client Belirli bir bağlı istemcide yöntem çağrıları
Clients Belirli bağlı istemcilere bir yöntem çağrır
Group Belirtilen gruptaki tüm bağlantılarda bir yöntem çağıran
GroupExcept Belirtilen bağlantılar dışında belirtilen gruptaki tüm bağlantılarda bir yöntem çağıran
Groups Birden çok bağlantı grubu üzerinde bir yöntem çağıran
OthersInGroup Hub yöntemini çağıran istemci hariç olmak üzere bir bağlantı grubu üzerinde bir yöntem çağırır
User Belirli bir kullanıcıyla ilişkili tüm bağlantılarda bir yöntem çağıran
Users Belirtilen kullanıcılarla ilişkili tüm bağlantılarda bir yöntem çağıran

Yukarıdaki tablolarda yer alan her özellik veya yöntem, yöntemine sahip bir nesne SendAsync döndürür. yöntemi, SendAsync çağrılacak istemci yönteminin adını ve parametrelerini sağlar.

İstemcilere ileti gönderme

Belirli istemcilere çağrı yapmak için nesnesinin özelliklerini Clients kullanın. Aşağıdaki örnekte üç Hub yöntemi vardır:

  • SendMessage kullanarak tüm bağlı istemcilere bir ileti Clients.All gönderir.
  • SendMessageToCaller kullanarak çağırana bir ileti Clients.Caller gönderir.
  • SendMessageToGroup gruptaki tüm istemcilere bir ileti SignalR Users gönderir.
public Task SendMessage(string user, string message)
{
    return Clients.All.SendAsync("ReceiveMessage", user, message);
}

public Task SendMessageToCaller(string user, string message)
{
    return Clients.Caller.SendAsync("ReceiveMessage", user, message);
}

public Task SendMessageToGroup(string user, string message)
{
    return Clients.Group("SignalR Users").SendAsync("ReceiveMessage", user, message);
}

Kesin olarak türü kesin olarak yazıldı hub'lar

kullanmanın bir SendAsync dezavantajı, çağrıl yapılacak istemci yöntemini belirtmek için bir sihirli dizeye bağlı olmasıdır. Bu, yöntem adı yanlış yazılmışsa veya istemcide eksikse kodu çalışma zamanı hatalarına açık bırakır.

kullanmanın bir SendAsync alternatifi, ile türünü kesin olarak Hub Hub<T> yazmadır. Aşağıdaki örnekte, ChatHub istemci yöntemleri adlı bir arabirime ayıklandı. IChatClient

public interface IChatClient
{
    Task ReceiveMessage(string user, string message);
}

Bu arabirim, önceki örneği yeniden düzenlemek için ChatHub kullanılabilir.

public class StronglyTypedChatHub : Hub<IChatClient>
{
    public async Task SendMessage(string user, string message)
    {
        await Clients.All.ReceiveMessage(user, message);
    }

    public Task SendMessageToCaller(string user, string message)
    {
        return Clients.Caller.ReceiveMessage(user, message);
    }
}

kullanma, Hub<IChatClient> istemci yöntemlerinin derleme zamanı denetimine olanak sağlar. Yalnızca arabirimde tanımlanan yöntemlere erişim sağlandığı için bu, sihirli Hub<T> dizelerin kullanımından kaynaklanan sorunları önler.

Türü kesin olarak belirli bir Hub<T> şekilde yazarak özelliğini devre dışı SendAsync bırakmanızı sağlar. Arabirimde tanımlanan tüm yöntemler yine de zaman uyumsuz olarak tanımlanabilir. Aslında, bu yöntemlerin her biri bir Task dönüşletir. Bu bir arabirim olduğu için anahtar sözcüğünü async kullanmayın. Örnek:

public interface IClient
{
    Task ClientMethod();
}

Not

AsyncSon ek, yöntem adı ile çıkarılmış değildir. İstemci yönteminiz ile .on('MyMethodAsync') tanımlanmamışsa ad olarak MyMethodAsync kullanmamanız gerekir.

Hub yönteminin adını değiştirme

Varsayılan olarak, sunucu hub'ı yöntemi adı .NET yönteminin adıdır. Ancak, hubMethodName özniteliğini kullanarak bu varsayılanı değiştirebilir ve yöntemi için el ile bir ad belirtebilirsiniz. İstemci, yönteminin iptali için .NET yöntem adı yerine bu adı kullandır.

[HubMethodName("SendMessageToUser")]
public Task DirectMessage(string user, string message)
{
    return Clients.User(user).SendAsync("ReceiveMessage", user, message);
}

Bağlantı için olayları işleme

SignalRHubs API'si bağlantıları OnConnectedAsync yönetmek ve izlemek için ve sanal yöntemleri OnDisconnectedAsync sağlar. İstemci OnConnectedAsync Hub'a bağlandığında, bir gruba ekleme gibi eylemleri gerçekleştirmek için sanal yöntemi geçersiz kılın.

public override async Task OnConnectedAsync()
{
    await Groups.AddToGroupAsync(Context.ConnectionId, "SignalR Users");
    await base.OnConnectedAsync();
}

İstemcinin OnDisconnectedAsync bağlantısı kesiken eylemler gerçekleştirmek için sanal yöntemi geçersiz kılın. İstemcinin bağlantısı kasıtlı olarak kes (örneğin connection.stop() çağrısıyla) exception olursa, parametresi null olur. Ancak, istemcinin bağlantısı bir hata (ağ hatası gibi) nedeniyle kesilirse, parametre exception hatayı açıklayan bir özel durum içerir.

public override async Task OnDisconnectedAsync(Exception exception)
{
    await Groups.RemoveFromGroupAsync(Context.ConnectionId, "SignalR Users");
    await base.OnDisconnectedAsync(exception);
}

Uyarı

Güvenlik Uyarısı: ConnectionId SignalR sunucu veya istemci ASP.NET Core sürümü 2,2 veya daha önceki bir sürümdeyse, kullanıma sunma kötü amaçlı kimliğe bürünmeye yol açabilir.

Hataları işleme

Hub yöntemlerinize gönderilen özel durumlar, yöntemini çağıran istemciye gönderilir. JavaScript istemcide yöntemi bir invoke JavaScript Promise döndürür. İstemci, kullanarak promise'e eklenmiş bir işleyici ile hata aldığında, catch çağrılır ve JavaScript nesnesi olarak Error geçirtir.

connection.invoke("SendMessage", user, message).catch(err => console.error(err));

Hub'nız bir özel durum oluşturursa bağlantılar kapatılacaktır. Varsayılan olarak, SignalR istemciye genel bir hata iletisi döndürür. Örnek:

Microsoft.AspNetCore.SignalR.HubException: An unexpected error occurred invoking 'MethodName' on the server.

Beklenmeyen özel durumlar genellikle veritabanı bağlantısı başarısız olduğunda tetiklenen bir özel durumdaki veritabanı sunucusunun adı gibi hassas bilgiler içerir. SignalR , bu ayrıntılı hata iletilerini varsayılan olarak bir güvenlik önlemi olarak açığa çıkarmaz. Özel durum ayrıntılarının gizlenme nedeni hakkında daha fazla bilgi için Güvenlikle ilgili dikkat edilmesi gerekenler makalesine bakın.

İstemciye yayılmasını istediğiniz olağanüstü bir koşul varsa sınıfını HubException kullanabilirsiniz. Hub yönteminden HubException bir atarsanız, iletinin tamamını istemciye SignalR gönderir, değiştirilmez.

public Task ThrowException()
{
    throw new HubException("This error will be sent to the client!");
}

Not

SignalR yalnızca özel Message durumun özelliğini istemciye gönderir. Yığın izlemesi ve özel durumla ilgili diğer özellikler istemci tarafından kullanılamaz.