我正在创建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控制器方法时看到警报,但没有任何反应。在我看来,用户没有在关联用户中注册,但我不明白为什么以及如何注册它。有人可以帮助我吗?
答案 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>());
一切正常!