2017-12-13 9 views
0

SignalRを使用するASP.NET MVC5アプリケーションがあります。 BackgroundTimer : IRegisteredObject私は株価情報(BitfinexKrakenなどからのティッカー)を私に与える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

  1. /詳細エラー:When I try to debug
  2. /アプリケーション - 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発信接続制限に達していたことが分かります。

+0

WebアプリケーションのAzure Portalで「常にオン」を有効にしましたか?ゲートからこの1つを取り除きたいだけです。 Azureは、非アクティブなWebアプリケーションをアンロードし、入ってくるサービスリクエストにリロードします。 –

+0

私は現在、このオプションを持たない無料の層にいます。そうではないにしても、私はアプリを爽快にしてブラウジングしているので、ハングアップしているとは思わない。要求が届かない場合にのみ発生します – Reath

+0

はい、Web Appsからの送信接続の制限があります。この接続制限は、インスタンスを拡大すると増加します。 –

答えて

0

ウェブアプリのためのいくつかのトラブルシューティングのヒント:

  1. 最初のピットストップは、(あなたがすでに述べてきたように)診断ログ]タブです。アプリケーションログ、Webサーバーログ、詳細なエラーメッセージ、および要求トレースの失敗をオンにします。 Visual StudioでWebサーバーのログを確認していることはすでに分かっています。

  2. 次に、[診断と解決の問題]タブをクリックします。私はあなたがここで運があるとは思わないが、Failed Request Tracingを試してみてください。これにより、失敗したリクエストごとに非常に詳細なエラーログが表示されます。ここでリクエストパイプラインからの出力を見ることができます。

  3. 次へ(まだ診断と解決の問題がある)、アプリケーションイベントを確認してください。あなたのサーバーへの明示的なHTTPリクエストではない、何かがバックグラウンドで爆発している場合は、ここでもっと幸運を祈るかもしれません。

  4. 次は(まだ診断と解決の問題)、インスタンスごとのメトリックを見て、すべてのオプションを調べてください。私は時間の経過とともに各メトリックの履歴を調べることで面白いこと(暴走するCPU、使い尽くされたスレッドプールなど)を見つけました。メリットのバランスが崩れているかどうかを確認することができます。

  5. Application Insightsでコードを計測します。無料版があります。それは超簡単です。実際には、Visual Studioがそれを行います。これにより、サーバー例外のスタックトレースを含む非常に詳細な情報が得られます。本当にトラブルシューティングに役立つため、すべてのサイトにApplication Insightsをインストールします。

関連する問題