SignalR - 如何以及在何处使用通过接口IUserIdProvider获得的句柄

时间:2014-05-02 03:36:29

标签: asp.net signalr real-time signalr-hub

示例我在一些地方(包括Microsoft SignalR官方网站)查看过,但不明白这是如何工作的。

我在课堂上实现了这个以获得不同的ID :(我没有使用IPrincipal.Identity.Name

public class CustomUserIdProvider : IUserIdProvider
{
    public string GetUserId(IRequest request)
    {
        //for example
        return Guid.NewGuid().ToString();
    }
}

但我不明白我是如何或在哪里获得新生成的ID?有人可以告诉我吗?或者让我明白这一切是如何运作的!

提前谢谢。

**更新**

现在我知道这是如何运作的。其实我很困惑......我很困惑。 Client.Clients Clients.User ConncetionId。所以没有得到预期的结果,我在Clients.User(Context.ConnectionId)中使用了User {{1}},这无关紧要。

对不起任何事情。

1 个答案:

答案 0 :(得分:2)

无法检索新生成的ID。由于您在Hub方法内部以及PersistentConnection.OnReceived内部可以使用IRequest对象,因此您应该能够在Hub方法中从IRequest派生调用者的UserId,就像在自定义GetUserId方法中一样。

您的示例实现没有用,因为您不会为同一个调用者发出的每个请求返回相同的id。您可能拥有的一个选项是通过从you can customize的查询字符串中提取用户ID来识别您的用户。但是,如果您不希望欺骗UserIds,则必须小心如何执行此操作。

一旦你有办法从同一个来电者的所有IRequest中提取相同的UserId,你应该可以做如下的事情:

public class CustomUserIdProvider : IUserIdProvider
{
    public string GetUserId(IRequest request)
    {
        //for example
        return MyStatic.ExtractUserId(request);
    }
}

public class MyHub : Hub
{
    public string GetMyUserId()
    {
        return MyStatic.ExtractUserId(Context.Request);
    }

    public void SendToUser(string userId, string message)
    {
        Clients.User(userId).send(message);
    }
}