Solución de problemas de SignalR (SignalR 1.x)

por Patrick Fletcher

Warning

Esta documentación no es para la versión más reciente de Signalr. Eche un vistazo a ASP.net Core signalr.

Este documento describe los problemas comunes de Troubleshooting con el SignalR.

Este documento contiene las siguientes secciones.

Se produce un error silencioso al llamar a métodos entre el cliente y el servidor

En esta sección se describen las posibles causas de que una llamada de método entre el cliente y el servidor falle sin un mensaje de error significativo. En una aplicación de SignalR, el servidor no tiene información sobre los métodos que implementa el cliente; cuando el servidor invoca un método de cliente, el nombre del método y los datos de parámetro se envían al cliente y el método se ejecuta solo si existe en el formato especificado por el servidor. Si no se encuentra ningún método coincidente en el cliente, no ocurre nada y no se genera ningún mensaje de error en el servidor.

Para investigar más a fondo los métodos de cliente que no se llaman, puede activar el registro antes de llamar al método start en el concentrador para ver qué llamadas proceden del servidor. Para habilitar el registro en una aplicación JavaScript, consulte Cómo habilitar el registro del lado cliente (versión de cliente JavaScript). Para habilitar el registro en una aplicación cliente .NET, consulte Cómo habilitar el registro del lado cliente (versión de cliente .NET).

Método mal escrito, firma incorrecta del método o nombre de concentrador incorrecto

Si el nombre o la firma de un método llamado no coincide exactamente con un método adecuado en el cliente, se producirá un error en la llamada. Compruebe que el nombre del método al que llama el servidor coincide con el nombre del método en el cliente. Además, SignalR crea el proxy de concentrador mediante métodos con mayúsculas SendMessage y minúsculas, sendMessage como es apropiado en JavaScript, por lo que se llamaría a un método llamado en el servidor en el proxy de cliente. Si usa HubName el atributo en el código del lado servidor, compruebe que el nombre utilizado coincide con el nombre utilizado para crear el concentrador en el cliente. Si no utiliza HubName el atributo, compruebe que el nombre del concentrador en un cliente JavaScript está en mayúsculas y minúsculas, como chatHub en lugar de ChatHub.

Nombre de método duplicado en el cliente

Compruebe que no tiene un método duplicado en el cliente que difiere solo por mayúsculas y minúsculas. Si la aplicación cliente sendMessagetiene un método llamado , compruebe SendMessage que no hay también un método al que se llama.

Perdiendo el analizador JSON en el cliente

SignalR requiere que un analizador JSON esté presente para serializar las llamadas entre el servidor y el cliente. Si el cliente no tiene un analizador JSON integrado (como Internet Explorer 7), deberá incluir uno en la aplicación. Puede descargar el analizador JSON aquí.

Mezcla de la sintaxis de Hub y PersistentConnection

SignalR utiliza dos modelos de comunicación: Hubs y PersistentConnections. La sintaxis para llamar a estos dos modelos de comunicación es diferente en el código de cliente. Si ha agregado un concentrador en el código del servidor, compruebe que todo el código de cliente usa la sintaxis de concentrador adecuada.

Código de cliente JavaScript que crea un PersistentConnection en un cliente JavaScript

var myConnection = $.connection('/echo');

Código de cliente JavaScript que crea un proxy de concentrador en un cliente Javascript

var myHub = $.connection.MyHub;

Código de servidor de C- que asigna una ruta a un PersistentConnection

RouteTable.Routes.MapConnection<MyConnection>("my", "/echo");

Código de servidor de C- que asigna una ruta a un concentrador o a varios concentradores si tiene varias aplicaciones

RouteTable.Routes.MapHubs();

La conexión se inició antes de agregar las suscripciones

Si la conexión del concentrador se inicia antes de que se agreguen métodos a los que se puede llamar desde el servidor al proxy, no se recibirán mensajes. El siguiente código JavaScript no iniciará el concentrador correctamente:

Código de cliente JavaScript incorrecto que no permitirá recibir mensajes de Hubs

var chat = $.connection.chatHub;
$.connection.hub.start().done(function () {
    chat.client.broadcastMessage = function (name, message) {...};
});

En su lugar, agregue las suscripciones de método antes de llamar a Start:

Código de cliente JavaScript que agrega correctamente suscripciones a un concentrador

var chat = $.connection.chatHub;
chat.client.broadcastMessage = function (name, message) {...};
    $.connection.hub.start().done(function () {
        ...
    });

Falta el nombre del método en el proxy del concentrador

Compruebe que el método definido en el servidor está suscrito en el cliente. Aunque el servidor define el método, todavía debe agregarse al proxy de cliente. Los métodos se pueden agregar al proxy de cliente de client las siguientes maneras (tenga en cuenta que el método se agrega al miembro del concentrador, no al concentrador directamente):

Código de cliente JavaScript que agrega métodos a un proxy de concentrador

// Method added to proxy in JavaScript:
myHubProxy.server.method1 = function (param1, param2) {...};
//Multiple methods added to proxy in JavaScript using jQuery:
$.extend(myHubProxy.server, {
    method1: function (param1, param2) {...},
    method2: function (param3, param4) {...}
});

Métodos hub o hub no declarados como públicos

Para ser visible en el cliente, la implementación del concentrador y los métodos deben declararse como public.

Acceso al hub desde una aplicación diferente

Solo se puede tener acceso a los concentradores de SignalR a través de aplicaciones que implementan clientes de SignalR. SignalR no puede interoperar con otras bibliotecas de comunicación (como SOAP o servicios web WCF.) Si no hay ningún cliente de SignalR disponible para la plataforma de destino, no puede acceder directamente al punto de conexión del servidor.

Serialización manual de datos

SignalR usará automáticamente JSON para serializar los parámetros del método: no hay necesidad de hacerlo usted mismo.

Método de concentrador remoto no ejecutado en el cliente en la función OnDisconnected

Este comportamiento es así por diseño. Cuando OnDisconnected se llama, el concentrador Disconnected ya ha entrado en el estado, que no permite llamar a otros métodos de concentrador.

Código de servidor de C- que ejecuta correctamente el código en el evento OnDisconnected

public class MyHub : Hub
{
    public override Task OnDisconnected()
    {
        // Do what you want here
        return base.OnDisconnected();
    }
}

Límite de conexión alcanzado

Cuando se usa la versión completa de IIS en un sistema operativo cliente como Windows 7, se impone un límite de 10 conexiones. Cuando utilice un sistema operativo cliente, use IIS Express en su lugar para evitar este límite.

La conexión entre dominios no se ha configurado correctamente

Si una conexión entre dominios (una conexión para la que la dirección URL de SignalR no está en el mismo dominio que la página de hospedaje) no está configurada correctamente, la conexión puede fallar sin un mensaje de error. Para obtener información sobre cómo habilitar la comunicación entre dominios, consulte Cómo establecer una conexión entre dominios.

Conexión mediante NTLM (Active Directory) que no funciona en el cliente .NET

Una conexión en una aplicación cliente .NET que usa seguridad de dominio puede producir un error si la conexión no está configurada correctamente. Para utilizar SignalR en un entorno de dominio, establezca la propiedad de conexión necesaria de la siguiente manera:

Código de cliente de C- que implementa las credenciales de conexión

connection.Credentials = CredentialCache.DefaultCredentials;

Otros problemas de conexión

En esta sección se describen las causas y las soluciones para síntomas específicos o mensajes de error que se producen durante una conexión.

Error "Se debe llamar al inicio antes de que se puedan enviar los datos"

Este error se ve normalmente si el código hace referencia a objetos SignalR antes de que se inicie la conexión. La conexión para los controladores y similares que llamará a los métodos definidos en el servidor debe agregarse una vez completada la conexión. Tenga en cuenta Start que la llamada a es asincrónica, por lo que el código después de la llamada se puede ejecutar antes de que se complete. La mejor manera de agregar controladores después de que una conexión se inicia por completo es colocarlos en una función de devolución de llamada que se pasa como parámetro al método start:

Código de cliente JavaScript que agrega correctamente controladores de eventos que hacen referencia a objetos SignalR

$.connection.hub.start().done(function () {
    // Wire up Send button to call NewContosoChatMessage on the server.
    $('#newContosoChatMessage').click(function () {
        contosoChatHubProxy.server.newContosoChatMessage(
            $('#displayname').val(), $('#message').val());
            $('#message').val('').focus();
    });

Este error también se verá si una conexión se detiene mientras se sigue haciendo referencia a objetos SignalR.

Error "301 Moved Permanently" o "302 Moved Temporarily"

Este error se puede ver si el proyecto contiene una carpeta llamada SignalR, que interferirá con el proxy creado automáticamente. Para evitar este error, no SignalR utilice una carpeta a la que se llame en la aplicación ni desactive la generación automática de proxy. Consulte el proxy generado y lo que hace por usted para obtener más detalles.

Error "403 Prohibido" en .NET o cliente Silverlight

Este error puede producirse en entornos entre dominios en los que la comunicación entre dominios no está habilitada correctamente. Para obtener información sobre cómo habilitar la comunicación entre dominios, consulte Cómo establecer una conexión entre dominios. Para establecer una conexión entre dominios en un cliente de Silverlight, consulte Conexiones entre dominios desde clientes de Silverlight.

Error "404 Not Found"

Hay varias causas para este problema. Compruebe todo lo siguiente:

  • Referencia de dirección proxy de concentrador no formateada correctamente: Este error se ve comúnmente si la referencia a la dirección proxy del concentrador generada no tiene el formato correcto. Compruebe que la referencia a la dirección del concentrador se realiza correctamente. Consulte Cómo hacer referencia al proxy generado dinámicamente para obtener más información.
  • Agregar rutas a la aplicación antes de agregar la ruta del concentrador: Si la aplicación utiliza otras rutas, compruebe que la MapHubsprimera ruta agregada es la llamada a .

"500 Error interno del servidor"

Este es un error muy genérico que podría tener una amplia variedad de causas. Los detalles del error deben aparecer en el registro de eventos del servidor o se pueden encontrar mediante la depuración del servidor. Se puede obtener información de error más detallada activando errores detallados en el servidor. Para obtener más información, consulte Cómo controlar errores en la clase Hub.

Error <"TypeError:> hubType is undefined"

Este error dará lugar MapHubs si la llamada a no se realiza correctamente. Consulte Cómo registrar la ruta de SignalR y configurar las opciones de SignalR para obtener más información.

JsonSerializationException no fue controlado por el código de usuario

Compruebe que los parámetros que envía a los métodos no incluyen tipos no serializables (como identificadores de archivo o conexiones de base de datos). Si necesita usar miembros en un objeto del lado servidor que no desea que se envíe al cliente JSONIgnore (ya sea por seguridad o por motivos de serialización), utilice el atributo.

Error "Error de protocolo: transporte desconocido"

Este error puede producirse si el cliente no admite los transportes que utiliza SignalR. Consulte Transportes y reserva para obtener información sobre qué navegadores se pueden utilizar con SignalR.

"Se ha deshabilitado la generación de proxy de JavaScript Hub."

Este error se DisableJavaScriptProxies producirá si se establece al incluir también una signalr/hubsreferencia al proxy generado dinámicamente en . Para obtener más información sobre cómo crear el proxy manualmente, consulte El proxy generado y lo que hace por usted.

"El ID de conexión está en el formato incorrecto" o "La identidad del usuario no puede cambiar durante una conexión De SignalR activa"

Este error se puede ver si se está utilizando la autenticación y el cliente cierra la sesión antes de que se detenga la conexión. La solución es detener la conexión de SignalR antes de cerrar la sesión del cliente.

"Error no capturado: SignalR: jQuery no encontrado. Asegúrese de que jQuery hace referencia antes del error SignalR.js file"

El cliente JavaScript de SignalR requiere jQuery para ejecutarse. Compruebe que la referencia a jQuery es correcta, que la ruta de acceso utilizada es válida y que la referencia a jQuery está antes de la referencia a SignalR.

Error "Uncaught TypeError:<Cannot>Can read property ' property ' of undefined"

Este error se debe a que no se hace referencia correctamente a jQuery o al proxy de concentradores. Compruebe que la referencia a jQuery y el proxy de concentradores es correcta, que la ruta de acceso utilizada es válida y que la referencia a jQuery está antes de la referencia al proxy de concentradores. La referencia predeterminada al proxy de concentradores debe tener el siguiente aspecto:

Código HTML del lado cliente que hace referencia correctamente al proxy de Hubs

<script src="/signalr/hubs"></script>

Error "RuntimeBinderException no se controló mediante el código de usuario"

Este error puede producirse Hub.On cuando se utiliza la sobrecarga incorrecta de. Si el método tiene un valor devuelto, el tipo de valor devuelto debe especificarse como un parámetro de tipo genérico:

Método definido en el cliente (sin proxy generado)

MyHub.On<ReturnType>("MethodName", LocalMethod);

El ID de conexión es incoherente o los saltos de conexión entre cargas de página

Este comportamiento es así por diseño. Dado que el objeto de concentrador se hospeda en el objeto de página, el concentrador se destruye cuando se actualiza la página. Una aplicación de varias páginas debe mantener la asociación entre los usuarios y los identificadores de conexión para que sean coherentes entre las cargas de página. Los identificadores de conexión se pueden almacenar ConcurrentDictionary en el servidor en un objeto o en una base de datos.

Error "Value cannot be null"

Actualmente no se admiten métodos del lado del servidor con parámetros opcionales; si se omite el parámetro opcional, se producirá un error en el método. Para obtener más información, consulte Parámetros opcionales.

"Firefox no puede establecer una conexión <>con el servidor en la dirección" error en Firebug

Este mensaje de error se puede ver en Firebug si se produce un error en la negociación del transporte WebSocket y se utiliza otro transporte en su lugar. Este comportamiento es así por diseño.

Error "El certificado remoto no es válido según el procedimiento de validación" en la aplicación cliente .NET

Si el servidor requiere certificados de cliente personalizados, puede agregar un certificado x509 a la conexión antes de realizar la solicitud. Agregue el certificado a Connection.AddClientCertificatela conexión mediante .

La conexión cae después de que se agota el tiempo de espera de la autenticación

Este comportamiento es así por diseño. Las credenciales de autenticación no se pueden modificar mientras una conexión está activa; para actualizar las credenciales, la conexión debe detenerse y reiniciarse.

OnConnected recibe una llamada dos veces cuando se usa jQuery Mobile

La función initializePage de jQuery Mobile obliga a que los scripts de cada página se vuelvan a ejecutar, creando así una segunda conexión. Las soluciones para este problema incluyen:

  • Incluya la referencia a jQuery Mobile antes de su archivo JavaScript.
  • Desactive initializePage la función estableciendo $.mobile.autoInitializePage = false.
  • Espere a que la página termine de inicializarse antes de iniciar la conexión.

Los mensajes se retrasan en las aplicaciones de Silverlight que usan eventos enviados por el servidor

Los mensajes se retrasan cuando se usan eventos enviados por el servidor en Silverlight. Para forzar el sondeo largo que se utilizará en su lugar, utilice lo siguiente al iniciar la conexión:

connection.Start(new LongPollingTransport());

"Permiso denegado" usando el protocolo Forever Frame

Este es un problema conocido, descrito aquí. Este síntoma se puede ver utilizando la última biblioteca JQuery; la solución consiste en degradar la aplicación a JQuery 1.8.2.

Errores de compilación y del lado del servidor

La siguiente sección contiene posibles soluciones a los errores de tiempo de ejecución del compilador y del lado del servidor.

La referencia a la instancia de Hub es null

Puesto que se crea una instancia de concentrador para cada conexión, no puede crear una instancia de un concentrador en el código usted mismo. Para llamar a métodos en un concentrador desde fuera del propio concentrador, vea Cómo llamar a métodos de cliente y administrar grupos desde fuera de la clase Hub para obtener una referencia al contexto del concentrador.

HTTPContext.Current.Session es null

Este comportamiento es así por diseño. SignalR no admite el estado de sesión ASP.NET, ya que habilitar el estado de sesión interrumpiría la mensajería dúplex.

No hay un método adecuado para anular

Es posible que vea este error si está utilizando código de documentación o blogs anteriores. Compruebe que no hace referencia a nombres de métodos OnConnectedAsyncque se han cambiado o en desuso (como ).

HostContextExtensions.WebSocketServerUrl es null

Este comportamiento es así por diseño. Este miembro está en desuso y no se debe usar.

"Una ruta llamada 'signalr.hubs' ya está en la colección de rutas"

Este error se verá MapHubs si la aplicación llama dos veces. Algunas aplicaciones MapHubs de ejemplo llaman directamente en el archivo de aplicación global; otros hacen la llamada en una clase de envoltura. Asegúrese de que la aplicación no hace ambas cosas.

Problemas de Visual Studio

En esta sección se describen los problemas encontrados en Visual Studio.

El nodo Documentos de script no aparece en el Explorador de soluciones

Algunos de nuestros tutoriales le dirigen al nodo "Documentos de script" en el Explorador de soluciones durante la depuración. Este nodo es generado por el depurador de JavaScript y solo aparecerá durante la depuración de clientes del explorador en Internet Explorer; el nodo no aparecerá si se utilizan Chrome o Firefox. El depurador de JavaScript tampoco se ejecutará si se está ejecutando otro depurador de cliente, como el depurador de Silverlight.

SignalR no funciona en Visual Studio 2008 o versiones anteriores

Este comportamiento es así por diseño. SignalR requiere .NET Framework 4 o posterior; Esto requiere que las aplicaciones de SignalR se desarrollen en Visual Studio 2010 o posterior.

Problemas con IIS

Esta sección contiene problemas con Internet Information Services.

El sitio web se bloquea después de la llamada de MapHubs

Este problema se ha corregido en la última versión de SignalR. Compruebe que está utilizando la versión más reciente de SignalR mediante la actualización de la instalación mediante NuGet.

Problemas de Azure

Esta sección contiene problemas con Microsoft Azure.

Los mensajes no se reciben a través del backplane de Azure después de modificar los nombres de los temas

Los temas utilizados por el backplane de Azure no están diseñados para ser configurables por el usuario.