SignalR no puede leer el cliente de propiedad de indefinido
signalr-hub signalr.client (8)
Estoy tratando de agregar SignalR a mi proyecto (ASPNET MVC 4). Pero no puedo hacer que funcione.
En la imagen de abajo puedes ver el error que estoy recibiendo. He leído muchas publicaciones de Stackoverflow, pero ninguna de ellas resuelve mi problema.
Esto es lo que hice hasta ahora:
1) Ran Install-Package Microsoft.AspNet.SignalR -Pre
2) Added RouteTable.Routes.MapHubs(); in Global.asax.cs Application_Start()
3) If I go to http://localhost:9096/Gdp.IServer.Web/signalr/hubs I can see the file content
4) Added <modules runAllManagedModulesForAllRequests="true"/> to Web.Config
5) Created folder Hubs in the root of the MVC application
6) Moved jquery and signalR scripts to /Scripts/lib folder (I''m not using jquery 1.6.4, I''m using the latest)
Este es mi Index.cshtml
<h2>List of Messages</h2>
<div class="container">
<input type="text" id="message" />
<input type="button" id="sendmessage" value="Send" />
<input type="hidden" id="displayname" />
<ul id="discussion">
</ul>
</div>
@section pageScripts
{
<!--Reference the SignalR library. -->
<script src="@Url.Content("~/Scripts/jquery.signalR-1.0.0-rc1.min.js")" type="text/javascript"></script>
<!--Reference the autogenerated SignalR hub script. -->
<script type="text/javascript" src="~/signalr/hubs"></script>
<script src="@Url.Content("~/Scripts/map.js")" type="text/javascript"></script>
}
Este es mi archivo IServerHub.cs (ubicado dentro de la carpeta Hubs)
namespace Gdp.IServer.Ui.Web.Hubs
{
using Microsoft.AspNet.SignalR.Hubs;
[HubName("iServerHub")]
public class IServerHub : Hub
{
public void Send(string name, string message)
{
Clients.All.broadcastMessage(name, message);
}
}
}
Y esto es map.js
$(function () {
// Declare a proxy to reference the hub.
var clientServerHub = $.connection.iServerHub;
// Create a function that the hub can call to broadcast messages.
clientServerHub.client.broadcastMessage = function (name, message) {
$(''#discussion'').append(''<li><strong>'' + name + ''</strong>: '' + message + ''</li>'');
};
// Get the user name and store it to prepend to messages.
$(''#displayname'').val(prompt(''Enter your name:'', ''''));
// Set initial focus to message input box.
$(''#message'').focus();
// Start the connection.
$.connection.hub.start().done(function () {
$(''#sendmessage'').click(function () {
// Html encode display name and message.
var encodedName = $(''<div />'').text($(''#displayname'').val()).html();
var encodedMsg = $(''<div />'').text($(''#message'').val()).html();
// Call the Send method on the hub.
clientServerHub.server.send(encodedName, encodedMsg);
// Clear text box and reset focus for next comment.
$(''#message'').val('''').focus();
});
});
});
Las referencias de DLL que veo para SignalR son:
- Microsoft.AspNet.SignalR.Core
- Microsoft.AspNet.SignalR.Owin
- Microsoft.AspNet.SignalR.SystemWeb
¿Alguna idea de cómo hacer que funcione? ¿Debo hacer algún cambio porque los guiones están en la carpeta / Script / lib?
NOTA : Estoy siguiendo las instrucciones que se encuentran here sobre cómo configurar Windsor Castle para que funcione con SignalR, y de nuevo, parece que no se puede crear el proxy y estoy obteniendo el mismo error:
Cannot read property client of undefined
lo que significa que no se creó el proxy para el concentrador
Así es como lo tengo en el servidor
public class IncidentServerHub : Hub
y así en el cliente
var clientServerHub = $.connection.incidentServerHub;
Nuevamente, puedo ver el archivo creado dinámicamente aquí:
/GdpSoftware.Server.Web/signalr/hubs
Entonces, ¿por qué no se crea el proxy?
¡¡¡Gracias por adelantado!!! Guillermo.
Debe colocar los scripts SignalR y jQuery, en el orden correcto:
<script src="/Scripts/jquery-1.6.4.min.js" ></script>
<script src="/Scripts/jquery.signalR-1.1.4.js"></script>
<script src="/signalr/hubs"></script>
Hacer que la clase Hub sea "pública" me lo resolvió.
Ok, encontré el problema, una cosa que tenía que hacer era:
Estas dos referencias faltaban:
Microsoft.AspNet.SignalR.Hosting.AspNet
Microsoft.AspNet.SignalR.Hosting.Common
Ahora, los incluí en el paquete nuget: WebApiDoodle.SignalR que usa esos dos. Mi pregunta es por qué esos Dlls no se agregaron. Instalé el paquete Nuget: Microsoft.AspNet.SignalR -Pre?
¿Error?
Luego tuve esto en mi global.asax.cs
using SignalR;
asi que
RouteTable.Routes.MapHubs();
Estaba usando ese, necesitaba eliminar ese uso y usar este:
using Microsoft.AspNet.SignalR;
Entonces los MapHubs lo usan y comenzaron a trabajar.
Espero que esto ayude a otros. Guillermo.
Para aquellos que intentaron agregar la ruta del archivo proxy generada en el paquete.
No incluya el "~ / signalr / hubs" en su BundleConfig.cs .
Puede tener JQuery.SignalR en el paquete:
bundles.Add(new ScriptBundle("~/bundles/signalr").Include(
"~/Scripts/jquery.signalR-{version}.js"));
Pero deberá agregar "/ signalr / hubs" en su vista:
@section Scripts {
@Scripts.Render("~/bundles/signalr")
@Scripts.Render("/signalr/hubs")
}
Espero que esto ayude.
Sus clases de hub deben definirse como públicas. Por ejemplo:
class ChatHub : Hub
en realidad debería ser
public class ChatHub : Hub
Tuve el mismo mensaje de error y resolví el problema al corregir un error tipográfico que tenía en el atributo [HubName] en la clase del concentrador; no coincidía exactamente con la propiedad en el javascript del lado del cliente.
C # hub class:
[HubName("gameHub")]
public class GameHub : Hub
{
javascript en el lado del cliente:
var foo = $.connection.gameHub;
"gameHub" debe ser el mismo.
hth
var myHub = $.connection.SentimentsHub;
ese problema cambiando mi código js de: var myHub = $.connection.SentimentsHub;
a var myHub = $.connection.sentimentsHub;
Entonces, si tiene un concentrador con el nombre de clase TestHub, debe usar el nombre testHub (la primera letra es minúscula) en js
Para la gente de ASP.Net MVC:
Comprueba tu _Layout.cshtml
Si llama al paquete jquery después del "@RenderBody ()" , obtendrá este error.
Resoultion: simplemente mueva el "@ Scripts.Render (" ~ / bundles / jquery ") a la sección principal o escriba todas las secuencias de comandos del señalizador en la sección" scripts "