SignalR
を使用するASP.NET MVC5
アプリケーションがあります。 BackgroundTimer : IRegisteredObject
私は株価情報(Bitfinex
、Kraken
などからのティッカー)を私に与える10秒ごとにAPIを呼び出して、それらをSignalRを通して、私がテーブルを使って表示するクライアントに送信します。azureでMVC5 SignalR "500 timed out"
ローカル私のアプリは完璧に動作します。この問題はAzureに公開するときに発生します。それは本当に奇妙な動作を開始します。それはある時点(時には1分、時には数時間)まで働き、ある時点で私はそれにアクセスしたいときに、私に500 - The request timed out
を与えるまで数分間待つ。私が現在解決できる方法は、Azure Portal(診断ログのオン/オフなど)の設定をいじることで、ある時点で再び動作を開始することです。私はコードを再発行しようとしました、時にはそれを修正する、時にはそれはまだ私にタイムアウトエラーを与える。
アプリがハングアップすると、クラウドエクスプローラを使用してデバッガを接続しようとしましたが、1〜2分間「ウォーミングアップサイト」にとどまった後、私にはUnable to connect to the Microsoft Visual Studio Remote Debugger
が届きます。非常にランダムな間隔で)私はデバッガに接続することができますが、サイトはデバッグセッション中に動作しているので、私はそれを使用しません。
私は深い紺碧を使用していないため、問題を調査するためにエラーログをどこで検索するかわかりません。私は問題はHTTPから来ていないと確信しているWebSocketException
:
- /詳細エラー:When I try to debug、
/アプリケーション - VSクラウドエクスプローラから>ログは、私はこれらの興味深いのファイルを見つけました時間制限がありキャッチしようとしているため、株式のサイトへのAPIリクエストそれは私のアプリのロジックの一部で、時には到達不能になることもあります。私の推測はSignalRの問題です(WebSocketExceptionを見た後)が、それが何であるか分かりません。私の設定は非常に基本的です(1つのハブ、引数のないapp.MapSignalR())、Azureでは "Enable WebSockets"オプションをチェックしました。ここで
いくつかのコードです:
Startup.cs
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.MapSignalR();
}
}
私はhere提案されているようapp.MapSignalR();
前UseAesDataProtectorProvider()
を追加しようとしましたが、それは何も変化しませんでしたが。
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();
});
UPDATE:
これは私が新しいティッカーを取得するために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
。これらのタスクが多すぎる接続を開く可能性はありますか?
UPDATE 2:The controller for path '/DebugWarmUp' was not found or does not implement IController.
UPDATE 3:基本的な階層にアップグレード
、私はこれ以上の問題を持っていない私は失敗したデバッグ取り付けるための理由は、このエラーであることを見た
。私はいくつかのTCP発信接続制限に達していたことが分かります。
WebアプリケーションのAzure Portalで「常にオン」を有効にしましたか?ゲートからこの1つを取り除きたいだけです。 Azureは、非アクティブなWebアプリケーションをアンロードし、入ってくるサービスリクエストにリロードします。 –
私は現在、このオプションを持たない無料の層にいます。そうではないにしても、私はアプリを爽快にしてブラウジングしているので、ハングアップしているとは思わない。要求が届かない場合にのみ発生します – Reath
はい、Web Appsからの送信接続の制限があります。この接続制限は、インスタンスを拡大すると増加します。 –