天蓝色的MVC5 SignalR“500超时”

问题描述 投票:1回答:1

我有一个使用ASP.NET MVC5SignalR应用程序。使用BackgroundTimer : IRegisteredObject我每隔10秒调用一次API来提供股票信息(来自BitfinexKraken等的代码)并通过SignalR将它们发送到我使用表格显示它们的客户端。

本地我的应用程序非常完美。我将其发布到Azure时会出现此问题。它开始行动真的很奇怪。它可以工作到某个点(有时是一分钟,有时是几个小时),在我想要访问它的某一刻,我等了几分钟,直到它给了我一个500 - The request timed out。我目前能够修复它的方式是开始搞乱Azure门户中的设置(打开/关闭诊断日志等),直到它在某个时刻再次开始工作。我试图重新发布代码,有时它修复它,有时它仍然给我一个超时错误。

当应用程序挂起时,我尝试使用云资源管理器附加调试器,但在“Warming Up Site”停留一两分钟之后,它会给我Unable to connect to the Microsoft Visual Studio Remote Debugger当网站再次启动时(正如我所说的那样,非常随机我能够附加一个调试器,但由于该站点在调试会话期间工作,我没有使用它。

我没有深入使用azure,我不知道在哪里搜索错误日志来调查问题。从VS Cloud Explorer - > Logs我发现了这些有趣的文件:

  1. /详细错误:When I try to debug
  2. /申请:WebSocketException 我确定问题不是来自对股票网站的HTTP API请求,因为它们有时间限制并尝试捕获。这是我的应用程序逻辑的一部分,他们有时无法访问。我的猜测是SignalR的问题(在查看WebSocketException之后),但我不知道它可能是什么。我的设置非常基本(一个集线器,app.MapSignalR()没有参数),在Azure中我检查了“启用WebSockets”选项。

这是一些代码:

Startup.cs

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.MapSignalR();
    }
}

我试图在UseAesDataProtectorProvider()之前添加app.MapSignalR();作为建议here,但它没有改变任何东西。

StatisticsHub.cs

public class StatisticsHub : Hub
{
    public override Task OnConnected()
    {
        Clients.Caller.getLastTickers();
        return base.OnConnected();
    }

    public Task JoinGroup(string stockName)
    {
        return Groups.Add(Context.ConnectionId, stockName);
    }

    public Task LeaveGroup(string stockName)
    {
        return Groups.Remove(Context.ConnectionId, stockName);
    }
}

}

与SignalR的JS连接:

var statisticsHub = $.connection.statisticsHub;
statisticsHub.client.addNewTicker = function (ticker) {
    addTickerToTable(ticker);
};

statisticsHub.client.getLastTickers = function(tickers) {
    tickers.each(function(index, ticker) {
        addTickerToTable(ticker);
    });
}

$.connection.hub.start().done(function () {
    assignEvents();
});

更新:

这是我每隔20秒调用一次获取新代码的方法:

private void SendNewTickersToClients(object state)
{
        Task.Run(() =>
        {
            var ticker = BtcRates.GetTicker(StockName.BitFinexUsd);
            statisticsHub.Clients.Group(ticker.StockName).addNewTicker(ticker);
        });

        Task.Run(() =>
        {
            var ticker = BtcRates.GetTicker(StockName.BitFinexEur);
            statisticsHub.Clients.Group(ticker.StockName).addNewTicker(ticker);
        });

        Task.Run(() =>
        {
            var ticker = BtcRates.GetTicker(StockName.KrakenUsd);
            statisticsHub.Clients.Group(ticker.StockName).addNewTicker(ticker);
        });

        Task.Run(() =>
        {
            var ticker = BtcRates.GetTicker(StockName.KrakenEur);
            statisticsHub.Clients.Group(ticker.StockName).addNewTicker(ticker);
        });

        Task.Run(() =>
        {
            var ticker = BtcRates.GetTicker(StockName.GdaxUsd);
            statisticsHub.Clients.Group(ticker.StockName).addNewTicker(ticker);
        });

        Task.Run(() =>
        {
            var ticker = BtcRates.GetTicker(StockName.GdaxEur);
            statisticsHub.Clients.Group(ticker.StockName).addNewTicker(ticker);
        });

        Task.Run(() =>
        {
            var ticker = BtcRates.GetTicker(StockName.GeminiUsd);
            statisticsHub.Clients.Group(ticker.StockName).addNewTicker(ticker);
        });
}

在azure的Diagnose problems选项卡中,我看到了这样的声明:Your app failed to make an outbound TCP connection because the machine-wide TCP Connection limit was hit。这些任务是否可能打开太多连接?

更新2:

我看到调试附加失败的原因是这个错误:The controller for path '/DebugWarmUp' was not found or does not implement IController.

更新3:

升级到基本层,我没有遇到任何问题。事实证明我达到了一些TCP传出连接限制。

c# asp.net asp.net-mvc azure signalr
1个回答
0
投票

Web Apps的一些疑难解答提示:

  1. 第一站(如您所述)是诊断日志选项卡。打开应用程序日志记录,Web服务器日志记录,详细错误消息和失败的请求跟踪。您已经了解了在Visual Studio中检查Web服务器日志。
  2. 接下来,点击Diagnose and Solve problems选项卡。我不认为你会在这里运气,但尝试失败的请求追踪。这将为每个失败的请求提供非常详细的错误日志。您可以在此处查看请求管道的输出。
  3. 接下来(仍在诊断和解决问题),检查应用程序事件。如果在后台发生的事情不是对服务器的明确HTTP请求,那么您可能会有更多的运气。
  4. 接下来(仍然是诊断和解决问题),查看每个实例的度量标准并查看所有选项。通过查看每个指标随时间的历史记录,我发现了有趣的东西(如失控的CPU,耗尽的线程池等)。这是一个很好的理智检查,可以让你知道如果你看到一个衡量标准失衡。
  5. 使用Application Insights检测代码。有一个免费版本。这样做非常简单。事实上,Visual Studio将为您完成。这为您提供了非常详细的信息,包括服务器异常的堆栈跟踪。我使用Application Insights检测我的所有网站,因为它确实有助于排除故障。
© www.soinside.com 2019 - 2024. All rights reserved.