Asp.net

SignalR - 使用 (IUserIdProvider) NEW 2.0.0 向特定使用者發送消息

  • October 22, 2013

在最新版本的 Asp.Net SignalR 中,添加了一種使用介面“IUserIdProvider”向特定使用者發送消息的新方法。

public interface IUserIdProvider
{
  string GetUserId(IRequest request);
}

public class MyHub : Hub
{
  public void Send(string userId, string message)
  {
     Clients.User(userId).send(message);
  }
}

我的問題是:我怎麼知道我要向誰發送消息?這種新方法的解釋很膚淺。SignalR 2.0.0 的聲明草案存在此錯誤且無法編譯。有沒有人實現過這個功能?

更多資訊:http ://www.asp.net/signalr/overview/signalr-20/hubs-api/mapping-users-to-connections#IUserIdProvider

擁抱。

SignalR 為每個連接提供 ConnectionId。要找到哪個連接屬於誰(使用者),我們需要在連接和使用者之間創建一個映射。這取決於您如何在應用程序中辨識使用者。

在 SignalR 2.0 中,這是通過使用內置的來完成的IPrincipal.Identity.Name,它是在 ASP.NET 身份驗證期間設置的登錄使用者標識符。

但是,您可能需要使用不同的標識符而不是使用 Identity.Name 來映射與使用者的連接。為此,此新提供程序可與您的自定義實現一起使用,以將使用者映射到連接。

使用 IUserIdProvider 將 SignalR 使用者映射到連接的範例

假設我們的應用程序使用 auserId來辨識每個使用者。現在,我們需要向特定使用者發送消息。我們有userIdand message,但 SignalR 還必須知道我們的 userId 和連接之間的映射。

為此,首先我們需要創建一個新類,它實現IUserIdProvider

public class CustomUserIdProvider : IUserIdProvider
{
    public string GetUserId(IRequest request)
   {
       // your logic to fetch a user identifier goes here.

       // for example:

       var userId = MyCustomUserClass.FindUserId(request.User.Identity.Name);
       return userId.ToString();
   }
}

第二步是告訴 SignalR 使用我們的CustomUserIdProvider而不是預設實現。這可以在初始化集線器配置時在 Startup.cs 中完成:

public class Startup
{
   public void Configuration(IAppBuilder app)
   {
       var idProvider = new CustomUserIdProvider();

       GlobalHost.DependencyResolver.Register(typeof(IUserIdProvider), () => idProvider);          

       // Any connection or hub wire up and configuration should go here
       app.MapSignalR();
   }
}

userId現在,您可以使用文件中提到的特定使用者向特定使用者發送消息,例如:

public class MyHub : Hub
{
  public void Send(string userId, string message)
  {
     Clients.User(userId).send(message);
  }
}

希望這可以幫助。

引用自:https://stackoverflow.com/questions/19522103