部署到IIS

时间:2015-06-04 16:20:36

标签: signalr

我真的很难过这个,我有一个页面,我用来收集有关我的Web应用程序中调用的方法的数据。当我从visual studio运行我的应用程序时,没有问题,一切都很好,我的所有服务器和客户端方法都按预期运行。

但是,当我将此应用程序部署到我在Windows Server 2008上运行IIS 7.5的Web服务器时,我的客户端方法不会一直触发,所有内容都看起来运行正常。但触发客户端事件永远不会发生。

客户端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);
});

服务器中心方法:

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");
    }

我的IIS网络服务器的Google控制台输出

  • [格林威治标准时间-0400(东部夏令时间)12:14:22] SignalR:客户订阅了hub&#39; centralhub&#39;

  • [GMT-0400(东部夏令时间)12:14:22] SignalR:与&#39; / signalr / negotiate谈判?connectionData =%5B%7B%22name%22%3A%22centralhub%22 %7D%5D&安培; clientProtocol = 1.3&#39 ;. jquery.signalR-2.0.3.js:76

  • [GMT-0400(东部夏令时间)12:14:22] SignalR:尝试连接到SSE端点&#39; http://tcdev.citadelsystems.com/signalr/connect?transport=serverSentEvents& ... 7Hb0f69Gs1q&amp; connectionData =%5B%7B%22name%22%3A %22centralhub%22%7D%5D&安培; TID = 2&#39 ;. jquery.signalR-2.0.3.js:76
  • [格林威治标准时间-0400(东部夏令时间)12:14:22] SignalR:EventSource已连接。 jquery.signalR-2.0.3.js:76
  • [格林威治标准时间-0400(东部夏令时间)12:14:22] SignalR:现在监控保持活动状态,警告超时为13333.333333333332,连接丢失超时为20000。 jquery.signalR-2.0.3.js:76
  • [GMT-0400(东部夏令时间)12:14:22] SignalR:调用centralhub.InitialMessage jquery.signalR-2.0.3.js:76
  • [GMT-0400(东部夏令时间)12:14:22] SignalR:调用centralhub.Test jquery.signalR-2.0.3.js:76
  • [GMT-0400(东部夏令时间)12:14:22] SignalR:调用centralhub.InitialMessage jquery.signalR-2.0.3.js:76
  • [GMT-0400(东部夏令时间)12:14:22] SignalR:调用centralhub.Test

Visual Studio 2013中的Google控制台输出

  • [格林威治标准时间-0400(东部夏令时间)12:17:56] SignalR:客户订阅了hub&#39; centralhub&#39; .jquery.signalR-2.0.3.js:76

  • [GMT-0400(东部夏令时间)12:17:56] SignalR:与&#39; / signalr / negotiate谈判?connectionData =%5B%7B%22name%22%3A%22centralhub%22 %7D%5D&安培; clientProtocol = 1.3&#39 ;. jquery.signalR-2.0.3.js:76

  • [GMT-0400(东部夏令时间)12:17:57] SignalR:尝试连接到SSE端点&#39; http://localhost:32568/signalr/connect?transport=serverSentEvents&connectio ... kMTNQps1lto&amp; connectionData =%5B%7B%22name% 22%3A%22centralhub%22%7D%5D&安培; TID = 3&#39 ;. jquery.signalR-2.0.3.js:76

  • [格林威治标准时间-0400(东部夏令时间)12:17:57] SignalR:连接了EventSource。 jquery.signalR-2.0.3.js:76

  • [格林威治标准时间-0400(东部夏令时间)12:17:57] SignalR:现在监控保持活动,警告超时为13333.333333333332,连接丢失超时为20000。 jquery.signalR-2.0.3.js:76

  • [格林威治标准时间-0400(东部夏令时间)12:17:57] SignalR:调用centralhub.InitialMessage jquery.signalR-2.0.3.js:76

  • [GMT-0400(东部夏令时间)12:17:57] SignalR:调用centralhub.Test jquery.signalR-2.0.3.js:76

  • [格林威治标准时间-0400(东部夏令时间)12:17:57] SignalR:触发客户端集线器事件&#39; logEvent&#39;在hub&#39; CentralHub&#39;。 jquery.signalR-2.0.3.js:76

  • [格林威治标准时间-0400(东部夏令时间)12:17:57] SignalR:触发客户端集线器事件&#39;测试&#39;在hub&#39; CentralHub&#39;。 jquery.signalR-2.0.3.js:76

  • [格林威治标准时间-0400(东部夏令时间)12:17:57] SignalR:调用centralhub.Test jquery.signalR-2.0.3.js:76

  • [格林威治标准时间-0400(东部夏令时间)12:17:57] SignalR:调用centralhub.InitialMessage

3 个答案:

答案 0 :(得分:0)

好的,我终于找到了一些关于这里发生了什么的信息。这是你为signalr设置依赖注入解析器的地方,这必须在Global.asax的Application_Start()方法中完成,你不能依赖于ninject web bootstrapper,你不能把它放在owin启动类中,就像上面的例子一样ASP.NET站点。它无法预测它有时会工作,但你会错过信息。

答案 1 :(得分:0)

我有同样的问题。我的SignalR应用程序可以在Visual Studio或Windows Local OS IIS中完美运行。但是当我在Windows Server 2008 R2上将其部署到IIS 7.5时,客户端方法将不会被一致地调用。这完全是因为我在部署IIS服务器中的应用程序池有10个工作处理器(即Web Garden)。这个post帮助我实现了这一点,当我将工作处理器设置为1时,它就成功了。显然this is by design

来自@AlexanderKöplinger:

  

这是设计的。两个工作进程不共享状态,客户端将在循环基础上分配,这意味着50%将连接到进程A,50%将连接到进程B.因为底层SignalR消息总线在内存中默认情况下,进程A看不到进程B的消息。

我现在将工作处理器设置为1,但我会尝试找到一种方法让Web Garden与SignalR配合使用。

更新

将工作处理器设置为1在缩放方面并不好。 SignalR团队确实为我们提供了使用SignalR和it's explained here.使Web Garden工作的方法。您有3种方法可供选择,我决定使用SQL server approach.设置顺利,简单,现在SignalR正在使用SQL服务器作为在不同工作处理器之间共享消息的背板。

答案 2 :(得分:0)

乍一看,您在done()中正在从服务器调用Test方法,该方法不存在或至少不存在。删除此行可以使其正常工作。