2012-06-24 15 views
18

Estoy usando Visual Studio 2012 Ultimate RC, SignalR 0.5.1 y Jquery 1.7.2 en una aplicación MVC4.

he visto: MVC4 SignalR "signalr/hubs" 501 Not Implemented Error

Pero no afecta a mi problema (estoy usando IIS Express para depuración).

Cuando intento utilizar SignalR, la variable $ .connection no está definida. Mi código del lado del servidor:

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

lado del cliente:

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

lado del cliente SignalR/hubs está siendo referenciado y puedo ver el código JS, que no lanza ningún error. Pero hacer referencia a $ .connection arroja un Uncaught TypeError: Cannot read property 'tenantHub' of undefined. También intenté hacer el ejemplo de chat predeterminado, da el mismo error. ¿SignalR no es compatible cuando se utiliza en VS2012 o solo estoy siendo estúpido?

+0

¿trató de depurar en el servidor? Cualquier excepción? ¿Comenzaste la conexión? '$ .connection.hub.start();' Eso es todo lo que puedo pensar en este momento :( –

+0

Sí, lo he intentado, pero la variable 'connection' en sí no está definida. – Bas

+0

Creo que el problema proviene de la ubicación de .js, ¿has ingresado 'jquery.signalR-0.5.1.min.js' y' signalr/hubs'? Quizás deberías intentar depurarlo usando 'firebug' –

Respuesta

9

Intente tomar [HubName("tenantHub")] de su clase. El mío no funcionaría si tuviera esos allí. También intente poner sus concentradores en una carpeta llamada "Hubs" en la raíz de su proyecto.

25

Intente eliminar el BundleConfig.RegisterBundles(BundleTable.Bundles); de Global.asax.cs, y vea si eso ayuda?

+12

Esto funcionó para mí. Entendí por qué, de forma predeterminada, la plantilla MVC4 incluye jQuery justo en la parte inferior de tu archivo de diseño (inesperado, y parece estúpido teniendo en cuenta incluye modernizr en la parte superior). Así que mi página incluía jquery dos veces lo que arruinaba todo. Gracias Thiem :) – Rocklan

+0

Este fue exactamente el problema para mí cuando utilicé la plantilla MVC 4 predeterminada. ¡¡Gracias!! – cortijon

+0

En realidad, ayuda, pero la manera correcta de hacerlo es incluir sus scripts adicionales en las secciones de scripts '@scripts de sección {}' SI desea usar el diseño predeterminado, O cambie el diseño para adaptarlo a sus necesidades (scripts en arriba, sin jquery en el diseño, etc.) –

3

Tuve el mismo problema en VS2012 RTM.

El problema fue que primero agregué el señalizador en BundleConfig.cs y esperaba que simplemente funcionara. Pero luego, usando 'Ver código fuente' en el navegador noté que signalr.js se incluyó antes de jquery.js. signalr.js se incluyó en la parte superior de la página, jquery se incluyó en la parte inferior de la página.

Después de tocar un poco con BundleConfig signalr.js se incluyó después de jquery.js, ¡y ahora el señalizador funciona como un amuleto!

2

trate de poner RouteTable.Routes.MapHubs(); como el primer elemento en Application_Start() en Global.asax.cs

Tengo una sample code/project here

5

Esto nos generalmente causada debido a la carga de jQuery dos veces. Por lo general, tenemos el hábito de cargar el jQuery en el pie de página. Dado que el señalizador se queja y le obliga a incluir la biblioteca jQuery antes del signalr-x.js.

puede incluir el jQuery antes de que los signalr-x.js y se puede hacer algo como esto en el pie de página, donde se incluye el plugin de jQuery para evitar cargar dos veces:

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

Espero que esto ayude. :)

+0

¡De hecho! Big +1 :) (aunque error de novato de mi parte) – army

0

Tuve un problema similar, el mío estaba funcionando desde la depuración visual studio 2010 pero no en el localhost (IIS7.5 windows 7). Descubrí que tenía una barra extra en la definición de "signalr/hubs", estaba usando "/ signalr/hubs". También agregué la referencia de JSON 2 js para la compatibilidad del navegador. Tenga en cuenta que el orden de declarar .js es importante.

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

Para encontrar este problema que activado el registro de la siguiente manera y miré en la consola de las herramientas dev para ver el error cuando se despliega en el servidor local.

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

Espero que esto ayude a alguien más. Estoy jugando con Chrome, IE9, 10 en varias PC ahora, ¡qué gran biblioteca!

0

Asegúrese de que no tiene un nombre de cubo duplicado; [HubName ("tenantHub")]: son dos o más clases de hub decoradas con el mismo nombre.

1

Si ninguno de estos te funciona, asegúrate de que en la fuente html final no solo aparezca la referencia al script SignalR después de jQuery, sino también que la versión coincida con el archivo real que tienes en la carpeta de scripts.

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

Por ejemplo éste coincide con la versión 2.0.2 de SignalR, si actualiza el paquete a través de SignalR entonces tendrá que editar manualmente esta línea.

0

en sentido inverso para John,

he tenido que añadir un/a la declaración signalr/Terminales

decir.

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

Se convirtió en

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