在最新版本的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 for each 连接提供ConnectionId.要找出哪个连接属于谁(用户),我们需要在连接和用户之间创建一个映射.这取决于您如何在应用程序中标识用户.

在SignalR 2.0中,这是通过使用内置IPrincipal.Identity.Name来实现的,它是在ASP.NET身份验证期间设置的登录用户标识符.

但是,您可能需要使用不同的标识符而不是身份来映射与用户的连接.名称为此,此新提供程序可与自定义实现一起使用,用于将用户映射到连接.

使用IUserIdProvider将信号器用户映射到连接的示例

假设我们的应用程序使用userId来标识每个用户.现在,我们需要向特定用户发送消息.我们有userIdmessage,但信号器还必须知道我们的用户ID和连接之间的映射.

要实现这一点,首先需要创建一个实现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();
    }
}

第二步是告诉Signal使用我们的CustomUserIdProvider,而不是默认实现.这可以在启动时完成.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);
   }
}

希望这能帮上忙.

Asp.net相关问答推荐

Web API Queryable - 如何应用 AutoMapper?

在 Sessions 中存储自定义对象

无法获取项目引用的依赖项

使用 IIS 的 ASP.NET 调试超时

c# - 如何从列表中获取值的总和?

使用 JSON.NET 解析 json 字符串

在 Asp.net mvc5 中使用用户名而不是邮箱作为身份

页面在谷歌浏览器中加载两次

在 ASP.NET 4.5 WebForms 中通过 bundle.config 与 BundleConfig.cs Bundle 资源

跟踪点有什么用途?

如何在 ASP.Net 的客户端 (JavaScript) 上判断 Page.Validate()?

如何判断用户代理是 ipad 还是 iphone?

当.NET抛出WebException((400)错误请求)时如何处理WebResponse?

IIS 8.0 ASP.NET 和错误 500.19

协调 ASP.NET 脚本包和源映射

ExecuteReader:连接属性尚未初始化

如何解决我的 ASP.Net MVC 应用程序中的 iisreset 后发生的 AntiForgeryToken 异常?

如何修复 ASP.NET 错误文件 'nnn.aspx' 尚未预编译,无法请求.?

ASP.NET 网格视图与列表视图

如何识别字符串是否包含 unicode 字符?