gpt4 book ai didi

c# - azure 的 MVC5 SignalR "500 timed out"

转载 作者:行者123 更新时间:2023-12-03 04:22:05 25 4
gpt4 key购买 nike

我有一个使用 SignalRASP.NET MVC5 应用程序。使用 BackgroundTimer : IRegisteredObject 我每 10 秒调用一些 API,为我提供股票信息(来自 BitfinexKraken 等的股票代码)通过 SignalR 将它们发送给客户端,我在客户端使用表格向它们展示。

在本地,我的应用程序运行完美。当我将其发布到 Azure 时,就会出现此问题。它开始变得非常奇怪。它会一直工作到某个时刻(有时是一分钟,有时是几个小时),当我想要访问它时,我会等待几分钟,直到它给我一个 500 - 请求超时 。我目前能够修复它的方法是开始弄乱Azure门户中的设置(打开/关闭诊断日志等),直到在某个时候它再次开始工作。我尝试重新发布代码,有时它修复了它,有时它仍然给我一个超时错误。

当应用程序挂起时,我尝试使用 Cloud Explorer 附加调试器,但在“预热站点”停留一两分钟后,它给我无法连接到 Microsoft Visual Studio 远程调试器 当站点再次启动时(正如我所说,这是在一个非常随机的间隔内发生的),我可以附加一个调试器,但由于该站点在调试 session 期间正在工作,所以我没有用它。 p>

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

  1. /详细错误:When I try to debug ,

  2. /应用程序:WebSocketException

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

这是一些代码:

Startup.cs

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

我尝试按照建议在 app.MapSignalR(); 之前添加 UseAesDataProtectorProvider() 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);
}
}

}

JS 连接到 SignalR:

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 的“诊断问题”选项卡中,我看到了这样的语句:您的应用程序无法建立出站 TCP 连接,因为达到了计算机范围的 TCP 连接限制。这些任务是否可能打开太多连接?

更新2:

我看到调试附加失败的原因是这个错误:路径“/DebugWarmUp”的 Controller 未找到或未实现 IController。

更新3:

升级到基本级别,我没有再遇到任何问题。结果我达到了一些 TCP 传出连接限制。

最佳答案

网络应用程序的一些故障排除提示:

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

  2. 接下来,点击“诊断和解决问题”选项卡。我认为您在这里不会有运气,但请尝试失败的请求跟踪。这将为您提供每个失败请求的极其详细的错误日志。您可以在此处查看请求管道的输出。

  3. 下一步(仍在诊断和解决问题),检查应用程序事件。如果后台发生的某些事情不是向您的服务器发出显式 HTTP 请求,那么您可能会更幸运。

  4. 接下来(仍在诊断和解决问题),查看“每个实例的指标”并浏览所有选项。通过查看每个指标随时间变化的历史记录,我发现了一些有趣的事情(例如 CPU 失控、线程池耗尽等)。这是一个很好的健全性检查,如果您发现指标不平衡,可以给您一个想法。

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

关于c# - azure 的 MVC5 SignalR "500 timed out",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47802366/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com