【问题标题】:Why Signalr does not stable all time?为什么 Signalr 一直不稳定?
【发布时间】: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


【解决方案1】:

每当您的桌面应用程序启动时,您都需要在您的集线器类对象中添加该 connectionid。所以你还需要在桌面应用程序中实现你的 signalR 对象。

所以现在当您从桌面应用程序创建新闻时,它会直接调用 hub 类,您将在其中获取所有活动连接以及您想要发送通知的位置。

所以需要在signalR双方实现。

【讨论】:

  • 我不是从桌面应用程序创建新闻。我正在从网络应用程序创建新闻。桌面应用程序是单独安装的计算机,以通知用户在创建新闻时显示警报..
  • 好的,但是对于它你需要从双方使用signalR,所以当你点击创建帖子时,首先你需要使用javascript从web应用程序调用hub类。希望你知道如何从 javascript 调用 hub 类方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-08
  • 2013-10-20
  • 2011-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多