Jquery SignalR PersistentConnection在Azure上40-50%的时间无法调用客户端回调方法

Jquery SignalR PersistentConnection在Azure上40-50%的时间无法调用客户端回调方法,jquery,asp.net,azure,signalr,signalr.client,Jquery,Asp.net,Azure,Signalr,Signalr.client,背景信息:我正在使用MVC4。我正在调用服务器上的PersistentConnection Signaler方法,并将其延迟20秒,然后再调用客户端回调方法。在回调方法中,我将url设置为MVC控制器中的下载方法,以便它启动文件流下载 问题是:这一切在IIS 7.5上的本地托管网站上运行得非常好,但是当我部署到Azure云时,它非常不一致。我在Chrome和IE 10上都做了10次测试:在Chrome上,40%的时间下载失败,而在IE 10上,50%的时间下载失败。所以现在的情况是,回调方法在4

背景信息:我正在使用MVC4。我正在调用服务器上的PersistentConnection Signaler方法,并将其延迟20秒,然后再调用客户端回调方法。在回调方法中,我将url设置为MVC控制器中的下载方法,以便它启动文件流下载

问题是:这一切在IIS 7.5上的本地托管网站上运行得非常好,但是当我部署到Azure云时,它非常不一致。我在Chrome和IE 10上都做了10次测试:在Chrome上,40%的时间下载失败,而在IE 10上,50%的时间下载失败。所以现在的情况是,回调方法在40-50%的时间里没有被调用。我知道这种情况是这样的,因为我把JavaScript代码放在那里,将当前时间打印到页面上,而这也不会触发。以下是Chrome和IE 10上的网络流量截图:

Chrome成功:

铬失效:

IE 10成功:

IE 10故障:

在我可以使用这个库之前,我真的需要使用Azure对客户端的SignalR回调100%有效。这是SignalR的已知错误,还是有不同的方法在WindowsAzure中使用此SignalR

这是我的密码:

服务器:

   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>

非常感谢您在这方面的帮助

David Fowler从上述评论中为我指出了正确的方向。事实证明,在我的Windows Azure配置中有2个Web角色实例正在运行。当有多个Azure实例运行时,需要使用背板,因为我们无法控制Azure负载平衡器选择哪个实例。这就是为什么从服务器发送回客户端的消息有50%的时间失败

新版本


信号机1.1

您是否有多台机器?如果你读了,读一下,我得查一下。你是说从服务器发送的一些消息很可能丢失了,因为在我们的案例中,Azure中使用了2台或更多的服务器?我有一个理论。请让我知道我是否有点不对劲,因为我对这一切都很陌生。如果Azure服务器场中有两台服务器,则意味着我的web应用程序有两个实例。客户端正在连接到其中一个实例,并发送客户端id和消息。Azure负载平衡器然后选择其中一个实例来响应客户机,因此它就像掷硬币一样由一个实例响应。如果未连接到客户端的一个响应,那么它将失败。否则,正确的实例响应将成功。我是否在大概范围内?第二个问题:如果我的公司已将Azure扩展到多个服务器,那么即使我只需要发送回呼叫客户端,是否也是设置背板的唯一解决方案?是的,尤其是在Azure上,您不控制负载平衡器。