我有一个使用ASP.NET MVC5
的SignalR
应用程序。使用BackgroundTimer : IRegisteredObject
我每隔10秒调用一次API来提供股票信息(来自Bitfinex
,Kraken
等的代码)并通过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我发现了这些有趣的文件:
这是一些代码:
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传出连接限制。
Web Apps的一些疑难解答提示: