.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>());