0

背景情報: MVC 4 を使用しています。サーバーで PersistentConnection SignalR メソッドを呼び出し、クライアントのコールバック メソッドにコールバックする前に 20 秒間遅延させています。コールバック メソッド内で、MVC コントローラー内のダウンロード メソッドに URL を設定して、ファイル ストリームのダウンロードを開始します。

問題: これは、IIS 7.5 でローカルにホストされている Web サイトでは完全に正常に機能しますが、Azure クラウドにデプロイすると非常に一貫性がなくなります。Chrome と IE 10 の両方で 10 回のテストを実行しました。つまり、コールバック メソッドが 40 ~ 50% の時間呼び出されていないということです。現在の時刻をページに出力するために JavaScript コードをそこに配置したため、これが事実であることはわかっていますが、それも同様に起動しません。Chrome と IE 10 のネットワーク トラフィックのスクリーンショットを次に示します。

クロムの成功: ここに画像の説明を入力

クロームの失敗: ここに画像の説明を入力

IE 10 の成功: ここに画像の説明を入力

IE 10 の障害: ここに画像の説明を入力

このライブラリを使用する前に、クライアントへの SignalR コールバックが Azure を使用して 100% 効果的であることが本当に必要です。これは SignalR の既知のバグですか? それとも Windows Azure でこのシグナルを使用する別の方法がありますか?

これが私のコードです:

サーバ:

   public class MultiFileConnection : PersistentConnection
    {
        protected override Task OnReceived(IRequest request, string connectionId, string data)
        {
            System.Threading.Thread.Sleep(20000);
            return Connection.Send(connectionId, data);

        }
    }

クライアント:

$('#dBtn').click(function () {

    var docIds = sceneLayoutService.getSelection();
    var href;
    var docIdsParam;

    if (docIds.length === 0) {
        alert("you need to select one");
        return false;
    }
    else if (docIds.length == 1) {
        docIdsParam = "docId=" + docIds;

        href = window.baseUrl;
        var today = new Date();

        // Initialize SignalR connection
        var connection = $.connection(href + "/multifile");

        $("#test-signalr").append("<li>" + today + "</li>");

        // SignalR callback method by server
        connection.received(function (data) {
            today = new Date();
            $("#test-signalr").append("<li>" + today + "</li>");
            connection.stop();
            href = window.baseUrl + '/CloudStorage/Download?' + docIdsParam;
            window.location.href = href;
        });

        // SignalR send data to the server
        connection.start()
            .done(function () {
                connection.send("you need to select one!!");
            })
            .fail(function () {
                alert("Error connecting to signalr realtime service");
            });
    }
    else {
        docIdsParam = jQuery.param(docIds.map(function (value) {
            return { "name": "docIds", "value": value };
        }));
        href = window.baseUrl + '/CloudStorage/DownloadZip?' + docIdsParam;
    }
    return true;
});

パッケージのリスト:

    <?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Company.CONNECT.Analytics.eFWrapper" version="1.0.0.1" targetFramework="net40" />
  <package id="Company.CONNECT.Analytics.Logging" version="1.0.0.11" targetFramework="net40" />
  <package id="Company.CONNECT.Web" version="1.1.0.12" targetFramework="net40" />
  <package id="Castle.Core" version="2.5.2" targetFramework="net40" />
  <package id="Castle.Core-log4net" version="2.5.2" targetFramework="net40" />
  <package id="Castle.Windsor" version="2.5.4" targetFramework="net40" />
  <package id="Castle.Windsor-log4net" version="2.5.2" targetFramework="net40" />
  <package id="CommonServiceLocator" version="1.0" targetFramework="net40" />
  <package id="EnterpriseLibrary.Common" version="5.0.505.0" targetFramework="net40" />
  <package id="EnterpriseLibrary.WindowsAzure.Configuration" version="5.0.1118.2" targetFramework="net40" />
  <package id="EntityFramework" version="4.1.10331.0" targetFramework="net40" />
  <package id="HtmlAgilityPack" version="1.4.6" targetFramework="net40" />
  <package id="jQuery" version="2.0.2" targetFramework="net40" />
  <package id="jQuery.UI.Combined" version="1.10.3" targetFramework="net40" />
  <package id="jQuery.Validation" version="1.8.0" targetFramework="net40" />
  <package id="jQuery.vsdoc" version="1.5.1" targetFramework="net40" />
  <package id="log4net" version="1.2.10" targetFramework="net40" />
  <package id="Microsoft.AspNet.Mvc" version="4.0.30506.0" targetFramework="net40" />
  <package id="Microsoft.AspNet.Providers" version="1.1" targetFramework="net40" />
  <package id="Microsoft.AspNet.Providers.Core" version="1.0" targetFramework="net40" />
  <package id="Microsoft.AspNet.Razor" version="2.0.30506.0" targetFramework="net40" />
  <package id="Microsoft.AspNet.SignalR" version="1.1.2" targetFramework="net40" />
  <package id="Microsoft.AspNet.SignalR.Core" version="1.1.2" targetFramework="net40" />
  <package id="Microsoft.AspNet.SignalR.JS" version="1.1.2" targetFramework="net40" />
  <package id="Microsoft.AspNet.SignalR.Owin" version="1.1.2" targetFramework="net40" />
  <package id="Microsoft.AspNet.SignalR.SystemWeb" version="1.1.2" targetFramework="net40" />
  <package id="Microsoft.AspNet.Web.Optimization" version="1.0.0" targetFramework="net40" />
  <package id="Microsoft.AspNet.WebPages" version="2.0.30506.0" targetFramework="net40" />
  <package id="Microsoft.Data.Edm" version="5.5.0" targetFramework="net40" />
  <package id="Microsoft.Data.OData" version="5.5.0" targetFramework="net40" />
  <package id="Microsoft.IdentityModel" version="6.1.7600.16394" targetFramework="net40" />
  <package id="Microsoft.Owin.Host.SystemWeb" version="1.0.1" targetFramework="net40" />
  <package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net40" />
  <package id="Microsoft.WindowsAzure.ConfigurationManager" version="2.0.1.0" targetFramework="net40" />
  <package id="Modernizr" version="2.6.2" targetFramework="net40" />
  <package id="Newtonsoft.Json" version="4.5.11" targetFramework="net40" />
  <package id="Owin" version="1.0" targetFramework="net40" />
  <package id="Pkcs12ProtectedConfigurationProvider" version="1.0.1" targetFramework="net40" />
  <package id="RequireJS" version="2.1.8" targetFramework="net40" />
  <package id="SevenZipSharp" version="0.64" targetFramework="net40" />
  <package id="SlowCheetah" version="2.5.5" targetFramework="net40" />
  <package id="System.Spatial" version="5.5.0" targetFramework="net40" />
  <package id="System.Web.Providers" version="1.2" targetFramework="net40" />
  <package id="Unity" version="2.1.505.2" targetFramework="net40" />
  <package id="Unity.Interception" version="2.1.505.2" targetFramework="net40" />
  <package id="WebGrease" version="1.1.0" targetFramework="net40" />
  <package id="WindowsAzure.Storage" version="2.0.5.1" targetFramework="net40" />
  <package id="WindowsAzure.Storage" version="2.0.6.0" targetFramework="net40" />
</packages>

これについて何か助けていただければ幸いです!

4

1 に答える 1

1

上記のコメントから、デビッド・ファウラーは私を正しい方向に向けました。私の Windows Azure 構成で 2 つの Web ロール インスタンスが実行されていることがわかりました。複数の Azure インスタンスが実行されている場合、Azure Load Balancer が選択するインスタンスを制御できないため、"バックプレーン" を使用する必要があります。これが、サーバーからクライアントに送り返されたメッセージが 50% の確率で失敗した理由です。

http://www.asp.net/signalr/overview/performance/scaleout-in-signalr (新しいバージョン)

http://www.asp.net/signalr/overview/older-versions/scaleout-in-signalr (signalR 1.1)

于 2013-07-21T23:51:51.790 に答える