【发布时间】:2019-10-10 08:12:24
【问题描述】:
我正在使用 .Net 框架 4.6 处理一个信号器项目。我有一个基本控制器:
public abstract class Base<THub> : ApiController where THub : IHub
{
private static readonly Func<IHubContext> ValueFactory = () => GlobalHost.ConnectionManager.GetHubContext<THub>();
private readonly Lazy<IHubContext> hub = new Lazy<IHubContext>(ValueFactory);
protected IHubContext Hub => hub.Value;
}
所以我正在从 Base 创建我的通知控制器。
public class NewsController : Base<NotificationHub>{
public async Task<IHttpActionResult> CreateNews(string name){
// connect database
// create news on database
....
Hub.Clients.All.send(name);
}
}
我正在从我的桌面应用程序连接这个集线器。我正在使用 CreateNews(string name)action 创建新闻,此操作在最初的几次尝试中发送通知。 然后它没有发送几次尝试,并在一段时间后再次向客户端发送通知。
[HubName("notification")]
public class NotificationHub: Hub
{
private static readonly ConnectionMapping<string> Connections = new ConnectionMapping<string>();
public override Task OnConnected()
{
var name = Context.User.Identity.Name;
Connections.Add(name, Context.ConnectionId);
return base.OnConnected();
}
public override Task OnDisconnected(bool stopCalled)
{
var name = Context.User.Identity.Name;
Connections.Remove(name, Context.ConnectionId);
return base.OnDisconnected(stopCalled);
}
public override Task OnReconnected()
{
var name = Context.User.Identity.Name;
if (!Connections.GetConnections(name).Contains(Context.ConnectionId))
{
Connections.Add(name, Context.ConnectionId);
}
return base.OnReconnected();
}
}
我在桌面客户端设置断点,没有错误或连接失败。它总是有效的。但通知并不总是发送调用 CreateNews(string name)action。
可能的原因是什么?
【问题讨论】:
-
你正试图在你的控制器中使用你的 hub 类对象,对吧?
-
是的,当一个消息被创建时,控制器将向所有客户端发送通知。还有其他方法吗?
-
不,据我所知,您不能在控制器中使用集线器类。因为所有活动连接都保留在 Hub 类中,所以当您尝试在控制器中使用它时,它将创建它的新实例。
-
嗯好吧,我该怎么办?
-
我正在更新答案,它会帮助你
标签: asp.net-mvc asp.net-web-api signalr