2013-01-03 8 views
40

Ich versuche SignalR mein Projekt (ASPNET MVC 4) gelesen hinzuzufügen. Aber ich kann es nicht funktionieren lassen.SignalR kann nicht Eigentum Client undefinierter

Im unteren Bild, das Sie den Fehler sehen kann ich empfangen werde. image Ich habe eine Menge von Stackoverflow Beiträge lesen, aber keiner von ihnen mein Problem ist zu lösen.

Das ist, was ich bisher getan: Das ist mein IServerHub.cs Datei (die sich innerhalb Hubs Ordner)

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) 

Dies ist mein 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> 
} 

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); 
     } 
    } 
} 

Und das ist 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(); 
     }); 
    }); 
}); 

Die DLL Ich sehe Referenzen für SignalR sind:

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

Irgendwelche Ideen, wie es funktionieren zu bekommen? Sollte ich Änderungen vornehmen, weil sich die Skripte im Ordner/Script/lib befinden?

HINWEIS Ich folge der Anweisung gefunden here wie Windsor Castle einzurichten, um es mit SignalR funktioniert, und wieder scheint, dass der Proxy kann nicht erstellt werden, und ich bin mit dem gleichen Fehler:

Cannot read property client of undefined 

was bedeutet, dass der Proxy an die Nabe nicht

erstellt wurde

Dies ist, wie ich es in dem Server

public class IncidentServerHub : Hub 

und wie dies in der Client-

var clientServerHub = $.connection.incidentServerHub; 

Auch hier kann ich die dynamisch erstellte Datei hier sehen:

/GdpSoftware.Server.Web/signalr/hubs 

So, Warum ist der Proxy nicht erstellt?

Vielen Dank im Voraus !!! Guillermo.

+0

Sie können mit versuchen '' – nemesv

+0

Das gleiche geschieht, jedenfalls sehe ich den Dateiinhalt beim Durchsuchen vom Browser aus. Sollte ich etwas ändern, weil die Skripte im Ordner/Script/lib sind? – polonskyg

Antwort

59

ich das Problem aus, indem mein js Code festgelegt: var myHub = $.connection.SentimentsHub; zu var myHub = $.connection.sentimentsHub;

Also, wenn Sie einige Nabe mit Klassennamen haben TestHub Sie testHub verwenden müssen (erster Buchstabe ist klein geschrieben) Name in js

+0

Es funktioniert. Thks –

+0

Danke, das half mir zu erkennen, dass meine Hub-Namen nicht ganz übereinstimmen. – wiseowl2828

+2

Nur der "erste" Buchstabe :), knifflig! – Dhanuka777

2

Ok, ich habe das Problem gefunden, eine Sache, die ich war tun musste:

Diese beiden Referenzen fehlten:

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

Nun, ich eingeschlossen ihnen nuget Paket bekommen: WebApiDoodle.SignalR welches diese zwei benutzt. Meine Frage ist, warum diese Dlls nicht hinzugefügt wurden ich installiert das Nuget-Paket: Microsoft.AspNet.SignalR -Pre?

Fehler?

Dann hatte ich in meinem global.asax.cs

using SignalR; 

so

RouteTable.Routes.MapHubs(); 

wurde mit, dass man, ich entfernen erforderlich, dass die Verwendung und verwenden Sie diese ein:

using Microsoft.AspNet.SignalR; 

Also die MapHubs verwenden diese und begannen zu arbeiten.

Hoffe das hilft anderen. Guillermo.

16

Ich hatte dieselbe Fehlermeldung und löste das Problem, indem ich einen Tippfehler korrigierte, den ich im [HubName] -Attribut der Hub-Klasse hatte - es stimmte nicht genau mit der Eigenschaft im clientseitigen Javascript überein.

C# Naben Klasse:

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

clientseitige JavaScript:

var foo = $.connection.gameHub; 

"gameHub" müssen gleich sein.

hth

29

Für diejenigen, die die erzeugte Proxy-Dateipfad in dem Bündel hinzuzufügen versucht.

Schließen Sie die "~/signalr/hubs" nicht in Ihre BundleConfig.cs ein.

können Sie haben die JQuery.SignalR im Bundle:

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

Aber Sie werden "/ signalr/Hubs" es Ihrer Ansicht hinzufügen müssen:

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

Ich hoffe das hilft.

+0

Ich kämpfte viel mit diesem. Du hast meinen Tag gerettet. Vielen Dank! – newman

+0

Die dynamisch generierte Hubs js file * wurde eigentlich nicht erstellt * bis ich richtig auf "/ signalr/hubs" referenziert – dudeNumber4

+0

MATE! Ich würde dir ein Plus von 100 dafür geben, wenn ich könnte. – Sentinel

6

für ASP.Net MVC Leute:
Überprüfen Sie Ihre _Layout.cshtml
Wenn Sie das jquery Bündel nach dem "@RenderBody()" aufrufen, wird diese Fehlermeldung angezeigt.
Resoution: Verschieben Sie einfach die "@Scripts.Render ("~/Bündel/jquery")“auf dem Kopfabschnitt oder Schreib alle signalr Skripte in den Skripten "Abschnitt"

3

Ihre Hub-Klassen müssen als public definiert werden. Zum Beispiel:

class ChatHub : Hub 

sollte eigentlich

public class ChatHub : Hub 
+0

Autsch !! Das war's. Ich bin froh, dass du das gepostet hast. Lektion gelernt. – raddevus

0

Making the Hub Klasse "public" gelöst es für mich sein.

+0

Diese Frage wird bereits als gelöst betrachtet. – abhiarora

0

Sie sollten SignalR und jQuery-Skripte setzen, in der richtigen Reihenfolge :

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