我有一个使用ASP.NET MVC5
的{{1}}应用程序。使用SignalR
我每隔10秒调用一次API,为我提供股票信息(来自BackgroundTimer : IRegisteredObject
,Bitfinex
等的代码。)并通过SignalR将它们发送给我显示它们的客户端使用表格。
本地我的应用程序非常完美。我将其发布到Azure时会出现此问题。它开始行动真的很奇怪。它可以工作到某个点(有时是一分钟,有时是几个小时),在我想要访问它的某个时刻,我等待几分钟,直到它给我一个Kraken
。我目前能够修复它的方式是开始搞乱Azure门户中的设置(打开/关闭诊断日志等),直到它在某个时刻再次开始工作。我试图重新发布代码,有时它修复它,有时它仍然给我一个超时错误。
当应用程序挂起时,我尝试使用Cloud Explorer附加调试器,但在“Warming Up Site”停留一两分钟后,它会给我500 - The request timed out
当网站再次启动时(如我说发生在一个非常随机的时间间隔)我能够附加一个调试器,但由于该站点在调试会话期间工作,我没有使用它。
我没有深入使用azure,我不确定在哪里搜索错误日志来调查此问题。来自VS Cloud Explorer - >日志我发现了这些有趣的文件:
我确信问题不是来自对股票网站的HTTP API请求,因为它们有时间限制并尝试捕获。这是我的应用程序逻辑的一部分,他们有时无法访问。我的猜测是SignalR的问题(在查看WebSocketException之后),但我不知道它可能是什么。我的设置非常基本(一个集线器,app.MapSignalR()没有参数),在Azure中我检查了“启用WebSockets”选项。
以下是一些代码:
Unable to connect to the Microsoft Visual Studio Remote Debugger
Startup.cs
我尝试按照建议here在public 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传出连接限制。
答案 0 :(得分:0)
Web Apps的一些疑难解答提示:
首先停止(正如您已经提到的)是诊断日志选项卡。打开应用程序日志记录,Web服务器日志记录,详细错误消息和失败的请求跟踪。您已经了解了在Visual Studio中检查Web服务器日志。
接下来,点击“诊断并解决问题”标签。我不认为你会在这里运气,但尝试失败的请求追踪。这将为每个失败的请求提供非常详细的错误日志。您可以在此处查看请求管道的输出。
接下来(仍在诊断和解决问题),检查应用程序事件。如果在后台发生的事情不是对服务器的明确HTTP请求,那么您可能会有更多的运气。
接下来(仍在诊断和解决问题),查看每个实例的指标并查看所有选项。通过查看每个指标随时间的历史记录,我发现了有趣的东西(如失控的CPU,耗尽的线程池等)。这是一个很好的理智检查,可以让你知道如果你看到一个衡量标准失衡。
使用Application Insights检测代码。有一个免费版本。这样做非常简单。事实上,Visual Studio将为您完成。这为您提供了非常详细的信息,包括服务器异常的堆栈跟踪。我使用Application Insights检测我的所有网站,因为它确实有助于排除故障。