您好,我从ASP.net用户之间的私人消息开始,使用SignalR,一切正常如果我使用ConnectionId - s,这样我就可以接收收件人的ConnectionId并向此人发送私人消息。现在关于问题,我希望在数据库中存储消息并在登录时加载它们,我正在使用ASP.net mvc5应用程序的标准成员资格,因此在重新连接后ConnectionId正在改变。我正在阅读文章Mapping SignalR Users to Connections,但我无法理解如何使用IUserProvider你能解释我如何制作这个节目。非常感谢。 这是我的集线器代码:
[HubName("chatHub")]
public class ChatHub : Hub
{
static List<ApplicationUser> Users = new List<ApplicationUser>();
private ApplicationDbContext db = new ApplicationDbContext();
public void Send(string name, string message)
{
Clients.All.addMessage(name, message);
}
public void SendPM(string name, string privatemessage, string userid)
{
//This line not Works I've commented it but filling It's correct way
//Clients.User(userid).addPM(name, privatemessage);
Clients.Client(userid).addPM(name, privatemessage);
}
public void Connect(string userName)
{
var id = Context.ConnectionId;
var appuser = db.Users.FirstOrDefault(x => x.UserName == userName);
var dbUsers = db.Users.ToList();
if (!Users.Any(x => x.ConnectionId == id))
{
Users.Add(new ApplicationUser { ConnectionId = id, UserName = userName, Id = appuser.Id });
Clients.Caller.onConnected(id, userName, Users);
Clients.AllExcept(id).onNewUserConnected(id, userName);
}
}
public override System.Threading.Tasks.Task OnDisconnected(bool stopCalled)
{
var item = Users.FirstOrDefault(x => x.ConnectionId == Context.ConnectionId);
if (item != null)
{
Users.Remove(item);
var id = Context.ConnectionId;
Clients.All.onUserDisconnected(id, item.UserName);
}
return base.OnDisconnected(stopCalled);
}
}
答案 0 :(得分:1)
文章说:
默认情况下,会有一个实现使用用户的IPrincipal.Identity.Name作为用户名。
这意味着要使映射起作用,您需要让用户在调用SignalR hub时登录(授权)用户。确保这一点的最简单方法是将[Authorize]
属性添加到ChatHub
以及返回聊天视图的控制器。
如果用户已获得授权,您可以通过调用以下方式从当前上下文中检索其用户名:
var username = Context.User.Identity.Name;
然后,以下内容应该有效(无需提供您自己的IUserIdProvider
):
public void SendPM(string name, string privatemessage, username)
{
Clients.Client(username).addPM(name, privatemessage);
}