SignalR:$ .connection未定义

时间:2012-06-24 17:31:22

标签: signalr visual-studio-2012 .net-4.5

我在MVC4应用程序中使用Visual Studio 2012 Ultimate RC,SignalR 0.5.1和Jquery 1.7.2。

我看过:MVC4 SignalR "signalr/hubs" 501 Not Implemented Error

但它不会影响我的问题(我使用IIS Express进行调试)。

当我尝试使用SignalR时,$ .connection变量未定义。我的服务器端代码:

[HubName("tenantHub")]
public class TenantHub : Hub
{
    ...
    void TenantChange(CrudAction action, Tenant tenant)
    {
        Clients.eventOccurred(action.ToString(), tenant);
    }
}

客户方:

$(function() { var test = $.connection.tenantHub; });

正在引用客户端SignalR/hubs,我可以看到JS代码,它不会抛出任何错误。但引用$ .connection会引发Uncaught TypeError: Cannot read property 'tenantHub' of undefined。还试图做默认的聊天示例,它给出了同样的错误。在VS2012中使用时是不支持SignalR还是我只是愚蠢?

9 个答案:

答案 0 :(得分:26)

尝试从 Global.asax.cs 中删除BundleConfig.RegisterBundles(BundleTable.Bundles);,看看是否有帮助?

答案 1 :(得分:9)

尝试从课堂上取走[HubName("tenantHub")]。如果那里有那些,我的工作就行不通。还可以尝试将您的集线器放入项目根目录中名为"Hubs"的文件夹中。

答案 2 :(得分:5)

这通常是由于加载jQuery两次造成的。通常我们习惯于在页脚中加载jQuery。由于signalr抱怨并强迫您在signalr-x.js之前包含jQuery库。

你可以在signalr-x.js之前包含jQuery,你可以在你包含jQuery插件的页脚中做这样的事情,以避免加载它两次:

<script type="text/javascript">
    !window.jQuery && document.write('<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"><\/script>');
    !window.jQuery && document.write('<script src="/public/js/vendor/jquery-1.9.1.min.js"><\/script>');
</script>

希望这会有所帮助。 :)

答案 3 :(得分:3)

我在VS2012 RTM中遇到了同样的问题。

问题是我首先在BundleConfig.cs中添加了signalr并期望它能正常工作。 但是在浏览器中使用“查看源代码”后,我注意到在jquery.js之前包含了signalr.js。 signalr.js包含在页面顶部,jquery包含在页面底部。

在使用BundleConfig之后,在jquery.js之后包含了signalr.js,现在signalr就像魅力一样!

答案 4 :(得分:2)

尝试将RouteTable.Routes.MapHubs();作为Application_Start()Global.asax.cs的第一项{/ 1}}

我有sample code/project here

答案 5 :(得分:1)

如果这些都不适合你,请确保在最终的html源代码中,不仅在jQuery之后出现对SignalR脚本的引用,而且版本与脚本文件夹中的实际文件相匹配。

<script src="~/Scripts/jquery.signalR-2.0.2.js"></script> 

例如,这个与SignalR的2.0.2版本匹配,如果你通过包升级SignalR,那么你必须手动编辑这一行。

答案 6 :(得分:0)

我有一个类似的问题,我的工作形式是visual studio 2010调试但不在localhost(IIS7.5 windows 7)上。我发现在“信号器/集线器”的定义中我有一个额外的斜线,我使用的是“/ signalr / hubs”。我还为浏览器兼容性添加了JSON 2 js参考。请注意,声明.js的顺序非常重要。

<script src="Scripts/JSON2.js" type="text/javascript"></script>
<script src="http://code.jquery.com/jquery-1.8.2.min.js" type="text/javascript"></script>
<script src="Scripts/jquery.signalR-1.1.2.min.js" type="text/javascript"></script>
<script src="signalr/hubs" type="text/javascript"></script>
<script type="text/javascript">

为了找到这个问题,我打开了如下记录,并在dev工具的控制台中查看了在localhost上部署时的错误。

// Logs errors to the browser dev 'f12' console
$.connection.hub.logging = true;

希望这有助于其他人。我现在在多台PC上玩Chrome,IE9,10 - 这是一个很棒的图书馆!

答案 7 :(得分:0)

确保您没有重复的中心名称; [HubName(“tenantHub”)] - 这是两个或多个用相同名称修饰的集线器类。

答案 8 :(得分:0)

与约翰相反,

我必须在信号器/集线器声明

中添加一个/

<script src="signalr/hubs" type="text/javascript"></script>

成了

<script src="/signalr/hubs" type="text/javascript"></script>