2013-08-02 10 views
5

Ich habe ähnliche Beiträge im Internet gesehen und nichts, was jemand vorgeschlagen hat funktioniert für mich. Ich bin wirklich mit der Wahl des Dumpings konfrontiert, die es an diesem Punkt scheint.Kann einfach nicht SignalR (asp.net mvc4) und require.js zusammenarbeiten

Dieses "mit SignalR und MVC 4 Tutorial Getting Started":

http://www.asp.net/signalr/overview/getting-started/tutorial-getting-started-with-signalr-and-mvc-4

sagt, Sie brauchen zwei Skript signalR Arbeit machen umfasst:

<!--Reference the SignalR library. --> 
    <script src="~/Scripts/jquery.signalR-1.0.1.js"></script> 
    <!--Reference the autogenerated SignalR hub script. --> 
    <script src="~/signalr/hubs"></script> 

Ich bin ratlos, wie wie man das zweite, das automatisch generierte SignalR-Hub-Skript macht, geschieht in require.js. Wenn ich etwas nicht vermisse, scheint es einfach keine brauchbare require.js-Syntax für die Einbeziehung von automatisch generierten Skripten zu geben. Ohne sie erhalten Sie diesen Fehler in Zeile 159 von jquery.signalR-1.1.2.js:

"JavaScript-Laufzeitfehler: SignalR:. Fehler beim Laden des Hub Stellen Sie sicher, Ihren Hub Referenz korrekt ist, zB"

Der Code an diesem Punkt in jquery.signalR wird dies zu tun:

signalR.hub = { 
      start: function() { 
       // This will get replaced with the real hub connection start method when hubs is referenced correctly 
       throw new Error("SignalR: Error loading hubs. Ensure your hubs reference is correct, e.g. <script src='/signalr/hubs'></script>."); 
     } 
    }; 

hat jemand tatsächlich machte das automatisch generierte Skript, was über require.js passieren?

Studiert dies ein bisschen mehr. Lassen Sie mich einige Details hinzufügen:

Ich verwende diesen Ansatz - Strukturierung skalierbare Client-Seite Anwendungen: (http://johndavidmathis.wordpress.com/2013/04/23/structuring-scalable-client-side-applications/), um eine skalierbare Struktur zu machen. Zweiter Teil in dieser Reihe "Erlaube Modulen, mehrere Dateien und eine logische Ordnerstruktur zu verwenden" http://johndavidmathis.wordpress.com/2013/04/23/structuring-scalable-client-side-applications/ hat mich in einen separaten Marionette-Chat-Modul aufgeteilt (getrennt von meiner Haupt-app.js-Datei), um eine bessere Dateistruktur zu erreichen. Ich mag diesen Ansatz sehr. Der Rest meines Projekts ist jetzt so eingerichtet und zeigt wirklich Vorteile, wenn es darum geht, Code zu finden. Ich denke, dass extra Split ist wo ich feststecke. Scheint nicht, diese zweite Abhängigkeit, das automatisch generierte Skript, in diese separate Chatmoduldatei zu bekommen. Ich studiere das noch, aber es sieht für mich so aus. require.js wird die Abhängigkeit in meine Marionette App:

require(["marionette","handlebars", "signalr", "signalr.hubs"], function (Marionette) { 
     window.App = new Marionette.Application(); 

     App.addRegions({ 
      headerRegion: "#header", 
      contentRegion: "#content", 
      footerRegion: "#footer", 
     });    

     require(["modules/main/loader", "modules/chat/loader"], function() { 
      App.start(); 
     }); 
    }) 

Wenn ich diese Abhängigkeit online seinen Weg weiter in die App in einer anderen Datei, in das Chat-Modul zu machen?

Etwas wie?

define(dependencies, 
     function() { 
      App.module("ChatModule", function (ChatModule, App, Backbone, Marionette, $, _, "signalr.hubs", "signalr.hubs") { 

      // SignalR Proxy created on the fly 
       var chat = $.connection.chatHub; 

       // Start the connection 
       $.connection.hub.start(); 

    //more chat code... 

Ein Update:

Die Antwort unten funktioniert in meinem dev Umgebung. Aber es funktioniert nicht, wenn ich den Code auf einem echten Produktionsserver veröffentliche.

Wenn der Code auf einem echten Produktionsserver veröffentlicht wird (IIS 6.1 unter Windows Server Enterprise 2008 R2), zeigt die Browserkonsole erneut einen "404" für die automatisch generierte Referenz.

Konkret zeigt die Konsole das "?" wird vor ".js" in den Referenzpfad eingefügt, so ...

http://mydomain.com/myapp/Scripts/application/signalr/hubs?.js ...

Versucht, das "?" aus, aber dann entfernt es meinen App-Namen aus dem Pfad, so ...

http://mydomain.com/signalr/hubs.js.

denke ich, was mir bekommen würde es die erste ist, ohne das „?“, Wie ...

http://mydomain.com/myapp/Scripts/application/signalr/hubs.js

Ich sehe einfach nicht, wie das passieren zu machen.

FINAL UPDATE:

Abschließendes Stück des Puzzles für Produktionsserver ist die virtuelle Verzeichnis der Website. Hier ist der letzte Code, der für mich funktioniert hat. Dank Raciel R für Ihre Hilfe:

requirejs.config({   
     paths: { 
      //core 
      "jquery": "jquery-1.9.1", 

      "signalr": "jquery.signalR-1.1.2", 
      "signalr.hubs": "/productionservervirtualdirectory/signalr/hubs?" 
     }, 
     shim: { 
      "jquery": {exports: "$"},    
      "signalr": { deps: ["jquery"] }, 
      "signalr.hubs": { deps: ["signalr"] } 
     }); 
    //Then all you have to do is to make signalr.hubs required in your modules. Ie: 

    require(["signalr.hubs"], function(){ 
     //your code here 
    }); 
+0

Haben Sie MapHubs auf dem Server aufgerufen? Siehe Frage: http://StackOverflow.com/Questions/16235175/404SignalR-Hubs-Fo-SignalR-Chat-Application/16242594#16242594, es ist eine Art umgekehrte, was Sie laufen, aber sollte Ihre Frage beantworten. –

+0

Ja. Tat dies. Kein Würfel. Das Problem scheint ganz spezifisch das Fehlen einer require.js-Syntax zu sein, um diese zweite Referenz zu erstellen - diejenige des automatisch generierten SignalR-Hub-Skripts. Ich sehe Leute, die verschiedene Versuche an der Syntax machen. Ich habe sie alle ausprobiert, aber keiner von ihnen hat für mich gearbeitet. Der untenstehende hat auch nicht für mich funktioniert. – Robert

Antwort

11
requirejs.config({   
    paths: { 
     //core 
     "jquery": "jquery-1.9.1", 

     "signalr": "jquery.signalR-1.1.2", 
     "signalr.hubs": "/signalr/hubs?" 
    }, 
    shim: { 
     "jquery": {exports: "$"},    
     "signalr": { deps: ["jquery"] }, 
     "signalr.hubs": { deps: ["signalr"] } 
    }); 

Dann alles, was Sie tun müssen, ist signalr.hubs in Ihre Module erforderlich machen. Dh:

require(["signalr.hubs"], function(){ 
    //your code here 
}); 
+0

Danke. Kein Würfel. Ich denke, dass vieles davon funktionieren könnte. Ich habe jedoch noch eine weitere Falte, die ich zu meinem ursprünglichen Beitrag hinzugefügt habe. Ich benutze diesen Ansatz - Strukturierung von skalierbaren Client-Side-Anwendungen: (http://johndavidmathis.wordpress.com/2013/04/23/sustructuring-scalable-client-side-applications/). Im zweiten Teil dieser Serie teile ich meinen eigentlichen Signalcode in ein separates Marionetten-Chat-Modul. Ich denke, dass es dort versagt. Scheint nicht, diese zweite Abhängigkeit, das automatisch generierte Skript, in dieses separate Chat-Modul zu bekommen. Siehe meine Bearbeitung. – Robert

+2

Unabhängig von der clientseitigen Code-Organisation und -Technologie, die Sie verwenden, sollte dies funktionieren. Der schwierige Teil hier (ich sah das gleiche Problem bei der Integration Signalgeber) ist die automatisch generierte Datei, die durch Hinzufügen der? Am Ende zu verhindern, dass request.js damit herumhantieren. Ich habe auch versucht, Noext-Plugin, aber ich hatte kein Glück. Der von mir vorgeschlagene Ansatz wurde mir von einem anderen SO-Kollegen vorgeschlagen. Require.js Shims und Pfade sind wirklich mächtig, um Abhängigkeiten zwischen Modulen zu beschreiben, die nicht auf require.js geschrieben sind, und für Ihre eigenen Module sollten Sie in Ordnung sein, indem Sie sie einfach richtig definieren. –

+0

Ich würde versuchen, von einem einfachen Szenario zu gehen und mehr Komplexität langsam einzuführen, damit Sie die Idee bekommen, wo Dinge versagen. SignalR kann mit Require.js arbeiten, in der Tat arbeite ich beide in einem Projekt. Ich denke, als beantwortet Ihre Frage. –

2

I RequireJS erfolgreich mit @ Raciel-r-Lösung eingerichtet, aber ich war immer noch Probleme mit anderer JavaScript-Module, wie Karma habe, die auch durch die dynamische Proxy verwechselt wurde. Ich konvertiert die signalr Proxy zu einer statischen Datei und verwendet, dass mit RequireJS statt:

  1. Import Microsoft.AspNet.SignalR.Utils

  2. Run packages/Microsoft.AspNet.SignalR.Utils.2.X.X/tools/signalr.exe ghp /path:my/bin /o:path/to/scripts/server.js wo /my/bin ist das Verzeichnis der Baugruppen mit SignalR Hubs enthalten.

  3. Ersetzen Sie Ihre Referenz um /signalr/hubs mit server:

    requirejs.config({   
    paths: { 
        // ... 
        "signalr.hubs": "path/to/scripts/server" 
    }, 
    // .... 
    
  4. Wenn Sie die Bequemlichkeit Methoden des erzeugten Proxy verwenden, Sie müssen auch sie neu schreiben (siehe How to create a physical file for the SignalR generated proxy)