天蓝色

时间:2017-12-13 21:27:21

标签: c# asp.net asp.net-mvc azure signalr

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

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

当应用程序挂起时,我尝试使用Cloud Explorer附加调试器,但在“Warming Up Site”停留一两分钟后,它会给我500 - The request timed out当网站再次启动时(如我说发生在一个非常随机的时间间隔)我能够附加一个调试器,但由于该站点在调试会话期间工作,我没有使用它。

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

  1. /详细错误:When I try to debug
  2. /申请:WebSocketException

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

  3. 以下是一些代码:

    Unable to connect to the Microsoft Visual Studio Remote Debugger

    Startup.cs

    我尝试按照建议herepublic class Startup { public void Configuration(IAppBuilder app) { app.MapSignalR(); } } 之前添加UseAesDataProtectorProvider(),但它没有任何改变。

    app.MapSignalR();

    StatisticsHub.cs

    }

    与SignalR的JS连接:

    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);
        }
    }
    

    更新:

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

    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();
    });
    

    在azure的“诊断问题”选项卡中,我看到了以下声明: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); }); } 。这些任务是否可能打开太多连接?

    更新2:

    我看到调试附加失败的原因是这个错误:Your app failed to make an outbound TCP connection because the machine-wide TCP Connection limit was hit

    更新3:

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

1 个答案:

答案 0 :(得分:0)

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

  1. 首先停止(正如您已经提到的)是诊断日志选项卡。打开应用程序日志记录,Web服务器日志记录,详细错误消息和失败的请求跟踪。您已经了解了在Visual Studio中检查Web服务器日志。

  2. 接下来,点击“诊断并解决问题”标签。我不认为你会在这里运气,但尝试失败的请求追踪。这将为每个失败的请求提供非常详细的错误日志。您可以在此处查看请求管道的输出。

  3. 接下来(仍在诊断和解决问题),检查应用程序事件。如果在后台发生的事情不是对服务器的明确HTTP请求,那么您可能会有更多的运气。

  4. 接下来(仍在诊断和解决问题),查看每个实例的指标并查看所有选项。通过查看每个指标随时间的历史记录,我发现了有趣的东西(如失控的CPU,耗尽的线程池等)。这是一个很好的理智检查,可以让你知道如果你看到一个衡量标准失衡。

  5. 使用Application Insights检测代码。有一个免费版本。这样做非常简单。事实上,Visual Studio将为您完成。这为您提供了非常详细的信息,包括服务器异常的堆栈跟踪。我使用Application Insights检测我的所有网站,因为它确实有助于排除故障。