asp.net-mvc如何强制服务器发送事件数据不断,使用 ASP.NET MVC + 那么 SignalR?

标签: Asp.net-MVC .Net C#
发布时间: 2017/3/25 10:48:13
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

ExportClient类具有 OnTickRecieved 事件,帮助我得到一些数据 (从市场投标价格)。所有我想要的是浏览器中收到我的图表上的实时数据。在按下的时 Go 按钮 UI 一边,它调用 Go() 方法在控制器,然后什么都不发生的事情。它是逻辑-因为在服务器上的请求之后, 控制器破坏。

我的问题是︰如何强制服务器不断将事件数据发送我吗?

控制器的代码︰

public class ChartsController : Controller
{
    [HttpGet]
    public void Go()
    {
        var exportClient = new ExportClient();
        exportClient.TickRecieved += exportClient_TickRecieved;
    }

    private void exportClient_TickRecieved(object sender, TickRecievedEventArgs args)
    {
        ImpulserHub.SendBidPrice(args.Bid);
    }
}

集线器的代码︰

[HubName("impulserHub")]
public class ImpulserHub : Hub
{
   public static void SendBidPrice(double bid)
   {
       var hubContext = GlobalHost.ConnectionManager.GetHubContext<ImpulserHub>();
       hubContext.Clients.All.sendBidPrice(bid);
   }
}

我测试了那么 SignalR,此代码工作正常︰

[HttpGet]
public void Go()
{
   ImpulserHub.SendBidPrice(3.3333333); // I have received this number on UI
}

解决方法 1:

最简单的方法会让你的出口客户作为单身或静态变量并在全球范围内的事件注册 (可能在你 Application_Start() 从动作的方法)。集线器代码也应该迁出了,因为集线器是瞬态像控制器。

这是如何,它会看起来像︰

private ExportClient _exportClient;
private IHubContext _impulserHub;

protected void Application_Start()
{
    _exportClient = new ExportClient();
    exportClient.TickRecieved += exportClient_TickRecieved;
    _impulserHub = GlobalHost.ConnectionManager.GetHubContext<ImpulserHub>();
}

private void exportClient_TickRecieved(object sender, TickRecievedEventArgs args)
{
    _impulserHub.Clients.All.sendBidPrice(args.Bid);
}

还有剩余的这段代码的问题。IIS 将拆掉不积极接收请求的网站。这意味着代码可能会停止工作在任何时候,即使触发该事件。管理应用程序拆卸很难的因为国家必须保存转移的应用程序启动和停止。除非你可以设置 IIS 从未想拆掉您的应用程序 (大多数情况下不可能在共享或云托管),你应该尝试使用可用作为nuget 程序包对立图书馆。它被专为这个用例和重构的一点,您的代码可以这样看︰

private ExportClient _exportClient;
private IHubContext _impulserHub;
protected void Application_Start()
{
    _exportClient = new ExportClient();
    exportClient.TickRecieved += exportClient_TickRecieved;

    _impulserHub = GlobalHost.ConnectionManager.GetHubContext<ImpulserHub>();

    BackgroundJob.Schedule(() => _impulserHub.Clients.All.sendBidPrice(_exportClient.GetBid()), TimeSpan.FromSeconds(5));
}
官方微信
官方QQ群
31647020