web-dev-qa-db-fra.com

SignalR: $ .connection n'est pas défini

J'utilise Visual Studio 2012 Ultimate RC, SignalR 0.5.1 et Jquery 1.7.2 dans une application MVC4.

J'ai regardé: MVC4 SignalR "signalr/hubs" 501 Not Implemented Error

Mais cela n’affecte pas mon problème (j’utilise IIS Express pour déboguer).

Lorsque j'essaie d'utiliser SignalR, la variable $ .connection n'est pas définie. Mon code côté serveur:

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

Côté client:

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

Le côté client SignalR/hubs est référencé et je peux voir le code JS, cela ne génère aucune erreur. Mais référencer $ .connection jette un Uncaught TypeError: Cannot read property 'tenantHub' of undefined. Également essayé de faire l'exemple de chat par défaut, il donne la même erreur. SignalR n'est-il pas pris en charge lorsqu'il est utilisé dans VS2012 ou suis-je simplement stupide?

18
Bas

Essayez de retirer [HubName("tenantHub")] de votre classe. Les miens ne fonctionneraient pas si j'avais ceux-là. Essayez également de placer vos hubs dans un dossier appelé "Hubs" à la racine de votre projet.

9
EagleHail

Essayez de supprimer la BundleConfig.RegisterBundles(BundleTable.Bundles); de Global.asax.cs et voyez si cela vous aide?

25
user1502389

Ceci est généralement dû au chargement de jQuery à deux reprises. Habituellement, nous avons l'habitude de charger jQuery dans le pied de page. Depuis le signalr se plaint et vous oblige à inclure la bibliothèque jQuery avant le signalr-x.js.

Vous pouvez inclure le jQuery avant le signalr-x.js et vous pouvez faire quelque chose comme ceci dans le pied de page où vous incluez le plugin jQuery pour éviter de le charger deux fois:

<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>

J'espère que cela t'aides. :)

5

J'ai eu le même problème dans VS2012 RTM.

Le problème était que j'ai d'abord ajouté signalr dans BundleConfig.cs et que je m'attendais à ce qu'il fonctionne. Mais en utilisant ensuite "View Source" dans le navigateur, j'ai remarqué que signalr.js était inclus avant jquery.js. signalr.js était inclus dans le haut de la page, jquery était inclus dans le bas de la page.

Après quelques manipulations de BundleConfig, signalr.js a été ajouté à la suite de jquery.js et maintenant, signalr fonctionne à merveille!

3
Joep Grooten

Essayez de mettre RouteTable.Routes.MapHubs(); comme tout premier élément de Application_Start() dans Global.asax.cs

J'ai un exemple de code/projet ici

2
jun estevez

Si rien de tout cela ne fonctionne pour vous, assurez-vous que dans votre source html finale, non seulement la référence au script SignalR apparaît après jQuery, mais également que la version correspond au fichier que vous avez dans votre dossier de scripts.

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

Par exemple, celui-ci correspond à la version 2.0.2 de SignalR, si vous mettez à niveau SignalR via un package, vous devrez éditer manuellement cette ligne.

1
Luis Ferrao

Assurez-vous de ne pas avoir un nom de hub en double. [HubName ("tenantHub")] - c'est-à-dire deux classes de hub ou plus décorées du même nom.

0
Tebo

J'ai eu un problème similaire, le mien travaillait au débogage de Visual Studio 2010 mais pas sur localhost (IIS7.5 Windows 7). J'ai trouvé que j'avais une barre oblique supplémentaire dans la définition de "signalr/hubs", j'utilisais "/ signalr/hubs". J'ai aussi ajouté la référence JSON 2 js pour la compatibilité du navigateur. Notez que l'ordre de déclaration de .js est important.

<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">

Pour résoudre ce problème, j'ai activé la journalisation comme suit et j'ai consulté la console des outils de développement pour voir l'erreur lors du déploiement sur localhost.

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

J'espère que ceci aide quelqu'un d'autre. Je joue avec Chrome, IE9, 10 sur plusieurs PC maintenant - quelle bibliothèque géniale!

0
John

À l'inverse de John,

Je devais ajouter un/à la déclaration de signalr/hubs

c'est à dire.

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

Est devenu

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