web-dev-qa-db-fra.com

SignalR ne peut pas lire le client de propriété non défini

J'essaie d'ajouter SignalR à mon projet (ASPNET MVC 4). Mais je ne peux pas le faire fonctionner.

Dans l'image ci-dessous, vous pouvez voir l'erreur que je reçois. image J'ai lu beaucoup de messages stackoverflow mais aucun d'eux ne résout mon problème.

Voici ce que j'ai fait jusqu'à présent:

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)

Ceci est mon 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>
}

Ceci est mon fichier IServerHub.cs (situé dans le dossier 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);
        }
    }
}

Et voici 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>:&nbsp;&nbsp;' + 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();
        });
    });
});

Les DLL que je vois des références pour SignalR sont:

  1. Microsoft.AspNet.SignalR.Core
  2. Microsoft.AspNet.SignalR.Owin
  3. Microsoft.AspNet.SignalR.SystemWeb

Des idées pour le faire fonctionner? Dois-je apporter des modifications car les scripts se trouvent dans le dossier/Script/lib?

[~ # ~] note [~ # ~] Je suis les instructions trouvées ici sur la configuration de Windsor Castle pour le faire fonctionner avec SignalR, et encore une fois, il semble que le proxy ne puisse pas être créé et j'obtiens la même erreur:

Cannot read property client of undefined

ce qui signifie que le proxy du hub n'a pas été créé

Voilà comment je l'ai sur le serveur

public class IncidentServerHub : Hub

et comme ça chez le client

var clientServerHub = $.connection.incidentServerHub;

Encore une fois, je peux voir le fichier créé dynamiquement ici:

/GdpSoftware.Server.Web/signalr/hubs

Alors, pourquoi le proxy n'est pas créé?

Merci d'avance!!! Guillermo.

46
polonskyg

J'ai résolu ce problème en changeant mon code js à partir de: var myHub = $.connection.SentimentsHub; à var myHub = $.connection.sentimentsHub;

Donc, si vous avez un hub avec le nom de classe TestHub, vous devez utiliser le nom testHub (la première lettre est en minuscule) dans js

73
Anton Shelin

Pour ceux qui ont essayé d'ajouter le chemin du fichier proxy généré dans le bundle.

N'incluez pas le "~/signalr/hubs" dans votre BundleConfig.cs.

Vous pouvez avoir le JQuery.SignalR dans le bundle:

bundles.Add(new ScriptBundle("~/bundles/signalr").Include(
                  "~/Scripts/jquery.signalR-{version}.js"));

Mais vous devrez l'ajouter "/ signalr/hubs" à votre vue:

@section Scripts {
    @Scripts.Render("~/bundles/signalr")
    @Scripts.Render("/signalr/hubs")
}

J'espère que ça aide.

34
Finickyflame

J'ai eu le même message d'erreur et j'ai résolu le problème en corrigeant une faute de frappe que j'avais dans l'attribut [HubName] sur la classe concentrateur - il ne correspondait pas exactement à la propriété dans le javascript côté client.

Classe de hub C #:

[HubName("gameHub")]
public class GameHub : Hub
{

javascript côté client:

var foo = $.connection.gameHub;

"gameHub" doit être le même.

hth

19
GraehamF

Pour les gens ASP.Net MVC:
Vérifiez votre _ Layout.cshtml
Si vous appelez le bundle jquery après le "@ RenderBody ()", vous obtiendrez cette erreur.
Resoultion: Déplacez simplement le "@ Scripts.Render (" ~/bundles/jquery ")" vers la section head o écrivez tous les scripts signalr dans le scripts "section"

6
Tosh

Vos classes de concentrateur doivent être définies comme publiques. Par exemple:

class ChatHub : Hub

devrait en fait être

public class ChatHub : Hub
5
Jide Lawal

Ok, j'ai trouvé le problème, une chose que je devais faire était:

Ces deux références manquaient:

Microsoft.AspNet.SignalR.Hosting.AspNet
Microsoft.AspNet.SignalR.Hosting.Common

Maintenant, je les ai inclus pour obtenir le paquet nuget: WebApiDoodle.SignalR qui utilise ces deux. Ma question est pourquoi ces DLL n'ont pas été ajoutées. J'ai installé le package Nuget: Microsoft.AspNet.SignalR -Pre?

Punaise?

Ensuite, je l'avais dans mon global.asax.cs

using SignalR;

alors

RouteTable.Routes.MapHubs();

utilisais celui-là, je devais supprimer celui-ci en utilisant et utiliser celui-ci:

using Microsoft.AspNet.SignalR;

Les MapHubs l'utilisent donc et commencent à fonctionner.

J'espère que cela aide les autres. Guillermo.

4
polonskyg

Vous devez mettre les scripts SignalR et jQuery, dans le bon ordre:

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

Dans mon cas, j'ai perdu Microsoft.Owin.Host.SystemWeb.dll & Microsoft.Owin.Security.dll dans mon projet. Après leur avoir ajouté des références, cette erreur a été résolue. ça marche maintenant.

0
An Mac

Rendre la classe Hub "publique" l'a résolu pour moi.

0
Nohim Ys