SignalR用户未在Client.Users中注册

时间:2015-01-14 15:09:45

标签: .net signalr

我正在创建2个用户之间的聊天。 这是我的枢纽和枢纽客户:

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);
}

从mvc控制器,我打电话:

string userId = this.User.Identity.GetUserId();
_conversationHub.Clients
            .User(userId)
            .MessageReceived(model.ConversationId, userId , model.Text, model.Date, true);
//I want to send back the message to the user, for testing purposes

最后这里是前端:

var conversationhub = $.connection.conversationHub;

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

我希望在触发我的mvc控制器方法时看到警报,但没有任何反应。在我看来,用户没有在关联用户中注册,但我不明白为什么以及如何注册它。有人可以帮助我吗?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

嗯,事实证明它没有用,因为我在我的MVC控制器上注入hubContext的方式。

我按照SignalR DI with ninject上的文章。

我的绑定错了。按照示例后,我将绑定更改为:

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

一切正常!