2013-07-20 2 views
0

ИНФОРМАЦИЯ ОБ ИСТОРИИ: Я использую MVC 4. Я вызываю метод SignalR PersistentConnection на сервере и задерживаю его на 20 секунд до его вызова обратно к методу обратного вызова клиента. В методе обратного вызова я устанавливаю URL-адрес методу загрузки в контроллере MVC, чтобы он инициировал загрузку потока файлов.SignalR PersistentConnection не может вызвать метод обратного вызова клиентов 40-50% времени на Azure

ПРОБЛЕМА: Все это отлично работает с локально размещенным веб-сайтом на IIS 7.5, но при разворачивании в облако Azure это очень несовместимо. Я выполнил 10 тестовых прогонов как в Chrome, так и в IE 10: в Chrome загрузка не удалась 40% времени, а в IE 10 загрузка не происходит в 50% случаев. Так что происходит, что метод обратного вызова не называется 40-50% времени. Я знаю, что это так, потому что я поставил код JavaScript там, чтобы напечатать текущее время на странице, и это тоже не срабатывает. Вот некоторые скриншоты сетевого трафика на Chrome и IE 10:

Chrome успеха: enter image description here

Chrome Failure: enter image description here

IE 10 Успех: enter image description here

IE 10 Failure: enter image description here

Мне действительно нужно поскольку обратные вызовы SignalR для клиента будут эффективны на 100% с использованием Azure, прежде чем я смогу использовать эту библиотеку. Является ли это известной ошибкой с SignalR или существует другой подход к использованию этого сигнала для Windows Azure?

Вот мой код:

SERVER:

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> 

бы признателен за любую помощь по этому вопросу!

+1

У вас есть более чем одна машина? Если вы это сделаете, прочитайте это http://www.asp.net/signalr/overview/performance-and-scaling/scaleout-in-signalr – davidfowl

+0

Мне нужно будет это проверить. Итак, вы говорите, что некоторые сообщения, отправляемые с сервера, скорее всего, будут потеряны, потому что в Azure (в нашем случае) используется 2 или более серверов? – TheDude

+0

У меня есть теория. Пожалуйста, дайте мне знать, если я не знаком, потому что я довольно новичок в этом. Если на ферме Azure есть два сервера, это означает, что есть два экземпляра моего веб-приложения. Клиент подключается к одному из этих экземпляров и отправляет идентификатор клиента, а также сообщение.Затем балансировщик нагрузки Azure выбирает один из экземпляров для ответа клиенту (так что это похоже на флип из монетки, на которую он отвечает). Если тот, который не подключен к клиенту, отвечает, то он терпит неудачу. В противном случае правильный ответ экземпляра успешно завершается. Я на футбольном поле? – TheDude

ответ

1

David Fowler, из приведенных выше комментариев, указал мне в правильном направлении. Оказывается, в моей конфигурации Windows Azure есть 2 экземпляра веб-роли. Когда выполняется несколько экземпляров Azure, необходимо использовать «объединительную плату», так как мы не можем контролировать, какой экземпляр выбирает Basure Balancer 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)