我有一个signalR服务器(控制台应用程序)和一个客户端应用程序(Asp.net MVC5)
如何在OAuth成员资格中向特定用户发送消息 .
实际上我无法从中心请求上下文中解析发件人用户 .
Context.User.Identity.Name
My Hub
public class UserHub : Hub
{
#region Hub Methods
public void LoggedIn(string userName, string uniqueId, string ip)
{
Clients.All.userLoggedIn(userName, uniqueId, ip);
}
public void LoggedOut(string userName, string uniqueId, string ip)
{
var t = ClaimsPrincipal.Current.Identity.Name;
Clients.All.userLoggedOut(userName, uniqueId, ip);
}
public void SendMessage(string sendFromId, string userId, string sendFromName, string userName, string message)
{
Clients.User(userName).sendMessage(sendFromId, userId, sendFromName, userName, message);
}
#endregion
}
Start hub class(Program.cs)
class Program
{
static void Main(string[] args)
{
string url = string.Format("http://localhost:{0}", ConfigurationManager.AppSettings["SignalRServerPort"]);
using (WebApp.Start(url))
{
Console.WriteLine("Server running on {0}", url);
Console.ReadLine();
}
}
}
4 回答
通过创建一个类来保持
connectionId
与userName
,因为我们知道Signalr
只有每个连接的对等体的connectionId
的信息 .创建一个类
UserConnection
声明一个列表
在从客户端连接期间将用户名作为查询字符串传递
在连接的mthod上推送用户连接到此列表
从列表中发送消息搜索用户名,然后检索用户连接,然后发送
DEMO
所有这些答案都不必要地复杂 . 我只是覆盖“OnConnected()”,获取唯一的Context.ConnectionId,然后立即将其广播回客户端javascript,以便客户端存储和发送以及后续调用中心服务器 .
在javascript中:
为了能够获得“Context.User.identity.Name”,您应该将您的身份验证集成到OWIN管道中 .
更多信息可以在这个SO答案中找到:https://stackoverflow.com/a/52811043/861018
In ChatHub Class Use This for Spacific User