【问题标题】:SignalR - Unable to get property 'client' of undefined or null referenceSignalR - 无法获取未定义或空引用的属性“客户端”
【发布时间】:2013-08-12 21:41:33
【问题描述】:

我在现有 Web 应用程序中使用 SignalR 时遇到问题。我收到 javaruntime 异常“无法获取未定义或空引用的属性‘客户端’”,因为当我尝试从 $.connection 对象检索集线器时,它返回空值。

在发布我的代码之前,我想提供一些背景知识和一些我已经尝试过的东西: - 如果我在本地运行项目,一切正常。只有当我将项目部署到 IIS 位置时才会出现问题。 - 我已验证我的集线器名称是正确的驼峰式大小写。同样,它在本地运行良好,并且仅在我将项目部署到 IIS 后才引发错误。 - 我已经确认我所有的 javascript 都已成功加载。 JQuery 库仅被引用一次,并且加载良好。 signalR javascript 和动态创建的信号器/集线器也是如此。 - 如果我创建一个新项目,并运行与在现有 Web 应用程序下作为 Web 应用程序运行的新 Web 应用程序相同的代码,则一切正常(正在使用相同的代码,只是在一个新项目中)。

有人对问题所在有任何想法吗?

中心代码:

Imports Microsoft.AspNet.SignalR

Public Class TestHub
    Inherits Hub

    Public Sub Connect()
        Try
            Clients.Caller.onConnect(Context.ConnectionId)
        Catch ex As Exception
            LogMessage("ERROR Connecting to Hub", 0, 0, "ERROR")
        End Try
    End Sub

End Class

网页代码:

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <script src="Scripts/jquery-1.6.4.min.js"></script>
    <!--Reference the SignalR library. -->
    <script src="Scripts/jquery.signalR-1.1.3.js"></script>
    <!--Reference the autogenerated SignalR hub script. -->
    <script src="signalr/hubs"></script>
    <script type="text/javascript">
        $(function () {
            // Declare a proxy to reference the hub. 
            var thub = $.connection.testHub;

            registerClientMethods(thub);

            // Start Hub
            $.connection.hub.start().done(function () {
                registerEvents(thub);
                thub.server.connect();
                alert('connected!');
            });
        });


        function registerClientMethods(thub) {
            thub.client.onConnect = function (id) {
                $('#lblConnectionID').text(id);
            }
        }

        function registerEvents() {

        }
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Label ID="lblConnectionID" runat="server" />
    </div>
    </form>
</body>
</html>

Global.asax 代码:

Imports System.Web.Routing
Imports Microsoft.AspNet.SignalR

Public Class Global_asax
  Inherits System.Web.HttpApplication
    Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
    ' Fires when the application is started
    Try
    ' Register the default hubs route: ~/signalr/hubs
    RouteTable.Routes.MapHubs()
    Catch ex As Exception
    LogMessage("ERROR initializing SignalR: " & ex.Message, 0, 0, "ERROR")
    End Try
End Sub
...

所以现在,当我转到我的页面 SignalRTest.aspx 时,thub.client.onConnected = ... 行会引发 javascript 错误:“无法获取未定义的属性 'client' 或空引用”

有人知道是什么原因造成的吗? 谢谢。

[编辑] - 在将工作的 signalr/hubs.js 文件与非工作文件进行比较后,我发现缺少以下部分:

proxies.testHub= this.createHubProxy('testHub'); 
    proxies.testHub.client = { };
    proxies.testHub.server = {
        connect: function () {
            return proxies.transactionHub.invoke.apply(proxies.testHub, $.merge(["Connect"], $.makeArray(arguments)));
         }
    };

关于为什么这不会包含在 signalr/hubs.js 文件中的任何想法?我在 Global.asax 中调用 MapHubs()...

谢谢!

[修复] 我删除了目标 Web 应用程序的 Bin 文件夹,然后重新部署。仍然不确定有什么不同。所有的 .DLL 都是一样的。它现在可以工作了。奇怪。

【问题讨论】:

  • 这很难,您可以详细说明适用于 IIS 的设置与不适用的设置之间的对比。您说,“作为一个新的 Web 应用程序,在现有 Web 应用程序下作为 Web 应用程序运行,一切正常”。这与 SignalR 失败的 IIS 上的设置有何不同?
  • 当然,我可以尝试... 在 IIS 中,我有一个名为“MyWebApplication”的 Web 应用程序。它是一个庞大而复杂的 Web 应用程序,已经存在了一段时间。我通过mycompany.com/mytest/signalrtest.aspx 进入我的测试页面。出于某种原因,我的集线器代理没有在这个项目中创建。如果我创建一个新的 Visual Studio 项目,并将其命名为仅包含信号器代码(集线器和客户端页面)的 mytest2,我将项目部署为 IIS 中我的主应用程序下的应用程序(所以现在我转到 mycompany.com/mytest/mychildtest/signalrtest.aspx)。现在我的集线器代理生成好了
  • 也许“MyWebApplication”有一些安全设置锁定了 Signalr 正常工作所需的一些 ASP.NET 库。您是否有任何应用程序日志记录,例如 Elmah 或 Enterprise Library?您是否检查了 Windows 应用程序事件日志以防万一?
  • 错误是javascript错误。但是 SignalR 创建的集线器代理在我的情况下似乎不起作用。我只是希望我知道更多关于为什么。据我所知,它是 Global.asax 中的 RouteTable.Routes.MapHubs() 创建代理,并且运行没有错误。除了尝试在 javascript 中获取之外,我如何检查 SignalR 集线器代理是否已创建?
  • 可能值得对远程 Web 服务器的请求运行 Fiddler 以查看是否有任何脚本加载错误。这有助于缩小搜索范围。

标签: javascript jquery .net iis signalr


【解决方案1】:

我在从 VS 2012 发布到 IIS 7.5 后尝试调试以运行 Web 应用程序时遇到此错误。经过一番拉扯,我意识到问题在于我在部署时没有更改 jquery 脚本和信号器路径。

为了解决这个问题,我必须将虚拟目录名称(“TestingChat”)添加到 jquery 和 signalr 的脚本标签的路径中。

例如从此:

<script src="Scripts/jquery-1.8.2.min.js" ></script>
<script src="/signalr/hubs"></script>

<script src="/TestingChat/Scripts/jquery-1.8.2.min.js" ></script>
<script src="TestingChat/signalr/hubs"></script>

【讨论】:

  • 我的问题也是 - 为了有资格在本地主机上运行项目,我不得不更改对 的引用
  • @SSED - +1 - 对我来说也一样,但我发现这样做更简单:
猜你喜欢
  • 2014-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-01
相关资源
最近更新 更多