部署到IIS时未一致调用Signalr客户端方法

部署到IIS时未一致调用Signalr客户端方法,signalr,Signalr,在这一点上我真的很困惑,我有一个页面,我用它来收集关于在我的web应用程序中调用什么方法的数据。当我从VisualStudio运行我的应用程序时,没有问题,一切都很好,我的所有服务器和客户端方法都按预期运行 但是,当我将此应用程序部署到在windows server 2008上运行IIS 7.5的Web服务器上时,R2 SP1 my client-side方法不会一直启动,一切看起来都运行正常。但触发客户端事件从未发生 客户端Javascript: var nlog = $.connection

在这一点上我真的很困惑,我有一个页面,我用它来收集关于在我的web应用程序中调用什么方法的数据。当我从VisualStudio运行我的应用程序时,没有问题,一切都很好,我的所有服务器和客户端方法都按预期运行

但是,当我将此应用程序部署到在windows server 2008上运行IIS 7.5的Web服务器上时,R2 SP1 my client-side方法不会一直启动,一切看起来都运行正常。但触发客户端事件从未发生

客户端Javascript:

var nlog = $.connection.centralHub;
$.connection.hub.logging = true;

$(function () {
    var logTable = $("#logTable");

    nlog.client.logevent = function (datetime, siteName, clientConId, logLevel, message, stack, eMessage) {
    var tr = $("<tr>");
        tr.append($("<td>").text(datetime));
        tr.append($("<td>").text(siteName));
        tr.append($("<td>").text(clientConId));
        tr.append($("<td>").text(logLevel));
        tr.append($("<td style='white-space: pre;'>").text(message));
        tr.append($("<td>").text(stack));
        tr.append($("<td>").text(eMessage));
        logTable.append(tr);
    };
    nlog.client.test = function() {
        $("#test").text("spit out a test");
    }
    $.connection.hub.start().done(function () {
        nlog.server.initialMessage();
        nlog.server.test();
    }, 5000);
});
来自我的IIS Web服务器的Google控制台输出

  • [12:14:22 GMT-0400(东部夏令时)]信号员:客户已订阅中心“centralhub”

  • [12:14:22 GMT-0400(东部夏令时)]信号员:与“/信号员/协商?连接数据=%5B%7B%22name%22%3A%22centralhub%22%7D%5D”协商,客户协议=1.3”。 jquery.signalR-2.0.3.js:76

  • [12:14:22 GMT-0400(东部夏时制)]信号员:尝试连接到SSE端点“…7Hb0f69Gs1q&connectionData=%5B%7B%22name%22%3A%22centralhub%22%7D%5D&tid=2”。 jquery.signalR-2.0.3.js:76
  • [12:14:22 GMT-0400(东部夏时制)]信号器:事件源已连接。 jquery.signalR-2.0.3.js:76
  • [12:14:22 GMT-0400(东部夏时制)]信号员:现在监视保持活动状态,警告超时为13333.3332,连接丢失超时为20000。 jquery.signalR-2.0.3.js:76
  • [12:14:22 GMT-0400(东部夏时制)]信号器:调用centralhub.InitialMessage jquery.signalR-2.0.3.js:76
  • [12:14:22 GMT-0400(东部夏时制)]信号员:调用中央实验室测试 jquery.signalR-2.0.3.js:76
  • [12:14:22 GMT-0400(东部夏时制)]信号器:调用centralhub.InitialMessage jquery.signalR-2.0.3.js:76
  • [12:14:22 GMT-0400(东部夏令时)]信号员:呼叫中央实验室测试
Visual Studio 2013的谷歌控制台输出

  • [12:17:56 GMT-0400(东部夏令时)]信号员:客户订阅了中心“centralhub”。jquery.SignalR-2.0.3.js:76

  • [12:17:56 GMT-0400(东部夏令时)]信号员:与“/信号员/协商?连接数据=%5B%7B%22name%22%3A%22centralhub%22%7D%5D”协商,客户协议=1.3”。 jquery.signalR-2.0.3.js:76

  • [12:17:57 GMT-0400(东部夏令时)]信号员:试图连接到SSE端点“…kMTNQps1lto和connectionData=%5B%7B%22name%22%3A%22centralhub%22%7D%5D和tid=3”。 jquery.signalR-2.0.3.js:76

  • [12:17:57 GMT-0400(东部夏时制)]信号器:事件源已连接。 jquery.signalR-2.0.3.js:76

  • [12:17:57 GMT-0400(东部夏令时)]信号员:现在监视保持活动,警告超时为13333.3332,连接丢失超时为20000。 jquery.signalR-2.0.3.js:76

  • [12:17:57 GMT-0400(东部夏时制)]信号器:调用centralhub.InitialMessage jquery.signalR-2.0.3.js:76

  • [12:17:57 GMT-0400(东部夏时制)]信号员:调用中央实验室测试 jquery.signalR-2.0.3.js:76

  • [12:17:57 GMT-0400(东部夏时制)]信号器:触发中心“CentralHub”上的客户端中心事件“logEvent”。 jquery.signalR-2.0.3.js:76

  • [12:17:57 GMT-0400(东部夏时制)]信号器:触发中心“CentralHub”上的客户端中心事件“测试”。 jquery.signalR-2.0.3.js:76

  • [12:17:57 GMT-0400(东部夏时制)]信号员:呼叫中央实验室测试 jquery.signalR-2.0.3.js:76

  • [12:17:57 GMT-0400(东部夏时制)]信号器:调用centralhub.InitialMessage


    • 好的,我终于找到了一些关于这里发生的事情的信息。它是为signalr设置依赖项注入解析器的地方,这必须在Global.asax的Application_Start()方法中完成,不能依赖ninject web bootstrapper,也不能像ASP.NET站点上的示例那样将其放入owin启动类中。它无法正常工作,有时会工作,但您会错过消息。

      我也遇到过同样的问题。我的SignalR应用程序可以在Visual Studio或Windows本地操作系统IIS中完美工作。但是,当我将其部署到WindowsServer2008R2上的IIS7.5时,客户端方法不会得到一致的调用。这都是因为部署IIS服务器中的应用程序池有10个工作处理器(即Web Garden)。这帮助我意识到了这一点,当我将工作处理器设置为1时,它成功了。显然

      摘自@AlexanderKöplinger:

      这是故意的。这两个工作进程不共享状态,客户端将在它们之间以循环方式分布,这意味着50%将连接到进程a,50%将连接到进程B。由于默认情况下底层信号器消息总线位于内存中,进程a看不到来自进程B的消息

      我现在将工作处理器设置为1,但我将尝试找到一种方法使Web Garden与Signal一起工作

      更新:
      将工作处理器设置为1不利于扩展。SignalR团队确实为我们提供了一种让Web Garden与SignalR一起工作的方法,您有3种方法可供选择,我决定使用该方法。安装过程顺利且简单,现在SignalR使用SQL server作为底板,在不同的工作处理器之间共享消息。

      乍一看,在您的完成()您正在从不存在或至少缺少的服务器调用测试方法。删除这一行可以使它正常工作。

      将依赖项注入解析器放入
      应用程序\u Start()
      解决了您的问题吗?我也有同样的问题,我尝试过,但有时仍然不会触发集线器事件。我认为Alexander是正确的,我已经很长时间没有研究过这个问题了,我不再能够访问代码库或硬件进行双重检查。然而,对我来说没有意义的是你设定了
      Hub Method: CentralHub
      
      public void InitialMessage()
          {
              string connId = Context.ConnectionId;
              _clientTracker.InitalMessage(connId);
          } 
      
      internal void InitalMessage(string connId)
          {
      
              Clients.All.logEvent(
                  DateTime.Now.ToString("F"),
                  "Harper Woods",
                  connId,
                  "info",
                  "Hub Started",
                  "No Message",
                  "No Message");
          }