.net 信号器用户未在客户端中注册。用户

.net 信号器用户未在客户端中注册。用户,.net,signalr,.net,Signalr,我正在创建两个用户之间的聊天。 这是我的集线器和集线器客户端: public class ConversationHub : Hub<IConversationHubClient> { public override Task OnConnected() { var id = this.Context.User.Identity.GetUserId(); //when I breakpoint here, I can see the i

我正在创建两个用户之间的聊天。 这是我的集线器和集线器客户端:

public class ConversationHub : Hub<IConversationHubClient>
{
    public override Task OnConnected()
    {
        var id = this.Context.User.Identity.GetUserId();
        //when I breakpoint here, I can see the id of my connected user.
        return base.OnConnected();
    }
}

public interface IConversationHubClient
{
    void MessageReceived(string conversationId, 
        string userId, 
        string text, 
        DateTime date, 
        bool isUser);
}
最后是前端:

var conversationhub = $.connection.conversationHub;

//messageReceived
conversationhub.client.MessageReceived = function (conversationId, userId, text, sentOn, isUser){
        alert(':D');
    };

我希望在触发mvc控制器方法时看到警报,但什么也没发生。在我看来,该用户似乎没有在已连接的用户中注册,但我不明白为什么以及如何注册它。有人能帮我吗

User.Identity.GetUserId()
不等于
Context.ConnectionId
,这是您需要调用特定客户端的内容。它识别信号机连接。
您需要将用户映射到连接。我建议您看一下教程:

好吧,事实证明它不起作用,因为我在MVC控制器上注入hubContext的方式

我跟着这篇文章继续读下去

我的装订错了。遵循示例后,我将绑定更改为:

   this.Kernel.Bind<IHubContext<IConversationHubClient>>()
            .ToMethod(x => GlobalHost.DependencyResolver.Resolve<IConnectionManager>()
               .GetHubContext<ConversationHub, IConversationHubClient>());
this.Kernel.Bind()
.ToMethod(x=>GlobalHost.dependencysolver.Resolve()
.GetHubContext());

一切都成功了

谢谢你的回复。是的,我知道userId和connectionId不同。我忘了提到我实现了一个IUserIdProvider,它返回用户ID。我最初认为,通过这样做,我将能够使用签名ctx.Clients.User(userId)调用我的方法,但它不起作用。您的答案似乎不正确。您链接到的教程说,实际上,如果您自己不注册任何内容,则会自动注册默认用户ID提供程序。该提供程序应该允许您使用Clients.user(userId)简单地连接到给定的用户,在本例中,userId是IPrincipal.Identity.Name,而在Asp.Net Identity中,UserName是UserName(而不是user.Id)。但和K.L.一样,我无法让它发挥作用。Client.All发送,Client.User(任何内容)不发送
   this.Kernel.Bind<IHubContext<IConversationHubClient>>()
            .ToMethod(x => GlobalHost.DependencyResolver.Resolve<IConnectionManager>()
               .GetHubContext<ConversationHub, IConversationHubClient>());