2013-08-02 20 views
5

Widziałem podobne posty w internecie i nikt nie sugerował dla mnie prac. Naprawdę mam do czynienia z wyborem zrzucania jednego lub drugiego, jak się wydaje w tym momencie.Po prostu nie można utworzyć SignalR (asp.net mvc4) i require.js współpracują ze sobą

Ten "Pierwsze kroki z SignalR i MVC 4 Samouczek":

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

mówi trzeba dwa skrypt obejmuje aby praca signalR:

<!--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> 

jestem ze stratą jak sprawić, by drugi, autogenerowany skrypt pisma SignalR, wystąpił w require.js. Chyba że czegoś mi brakuje, wydaje mi się, że nie ma w nim wydajnej składni require.js do włączenia autogenerowanych skryptów. Bez niej dostać ten błąd na linii 159 jquery.signalR-1.1.2.js:

"Javascript Runtime error: SignalR. Error piast załadunku Zapewnienie koncentratorów odniesienia jest prawidłowe, na przykład"

kodu w tym momencie w jquery.signalR to robi:

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

ktoś faktycznie to wygenerowany automatycznie przez skrypt rzeczą zdarzyć require.js?

Nauczyłem się tego trochę więcej. Pozwolę sobie dodać kilka szczegółów:

Używam tego podejścia - Strukturyzacja skalowalnych aplikacji po stronie klienta: (http://johndavidmathis.wordpress.com/2013/04/23/structuring-scalable-client-side-applications/) w celu uzyskania bardziej skalowalnej struktury. Druga część z tej serii "Pozwól modułom wykorzystywać wiele plików i strukturę folderów logicznych" pozwala mi podzielić mój rzeczywisty kod signalr na oddzielny moduł czatu Marionette (oddzielny od mojego głównego pliku app.js), aby uzyskać lepszą strukturę plików. Bardzo podoba mi się to podejście. Reszta mojego projektu jest teraz tak skonfigurowana i naprawdę pokazuje korzyści, jeśli chodzi o znajdowanie kodu. Myślę, że dodatkowy podział to miejsce, w którym utknąłem. Nie można uzyskać tej drugiej zależności, automatycznie wygenerowanego skryptu, do tego osobnego pliku modułu czatu. Nadal studiuję to, ale w tym momencie wygląda mi to na rękę. require.js dostaje zależność w mojej aplikacji Marionetek:

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

Jeśli chcę rozmawiać tę zależność, aby jego sposób dalej w aplikacji do modułu czatu w innym pliku?

Coś jak?

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... 

Aktualizacja:

Poniższa odpowiedź działa w moim środowiska dev. Ale to nie działa, kiedy publikuję kod na prawdziwym serwerze produkcyjnym.

Po opublikowaniu kodu na prawdziwym serwerze produkcyjnym (usługi IIS 6.1 w systemie Windows Server Enterprise 2008 R2) konsola przeglądarki po raz kolejny wyświetla "404" dla automatycznie generowanego odwołania.

W szczególności konsola pokazuje "?" jest dodawany do ścieżki referencyjnej przed ".js", tak ...

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

Próbowałem wziąć "?" ale potem usuwa nazwę mojej aplikacji ze ścieżki, tak ...

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

myślę, co by mnie tam jest pierwszy, bez „?”, Jak ...

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

ja po prostu nie widząc, jak sprawić, by tak się stało.

FINAL UPDATE:

końcowy element układanki na serwerze produkcyjnym jest katalog wirtualny witryny. Oto ostatni kod, który zadziałał dla mnie. Dzięki Raciel R za pomoc:

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

Zadzwoniłeś do MapHubs na serwerze? Zobacz pytanie: http://stackoverflow.com/questions/16235175/404signalr-hubs-for-signalr-chat-application/16242594#16242594, jest to rodzaj odwrotności tego, na co masz ochotę, ale powinien odpowiedzieć na twoje pytanie. –

+0

Tak. Zrobił to. Nie ma kości. Problemem wydaje się być szczególnie brak składni require.js, aby utworzyć drugie odniesienie - do autogenerowanego skryptu SignalR hub. Widzę ludzi, którzy podejmują różne próby składni. Próbowałem ich wszystkich, ale żaden z nich nie pracował dla mnie. Ten poniżej też mi nie pasował. – Robert

Odpowiedz

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

Następnie wszystko co musisz zrobić, to zrobić signalr.hubs wymaganych w modułach. Tj:

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

Dzięki. Nie ma kości. Myślę, że wiele z tego może działać. Mam jeszcze jedną zmarszczkę, którą dodałem do mojego pierwotnego postu. Używam tego podejścia - Strukturyzacja skalowalnych aplikacji klienckich: (http://johndavidmathis.wordpress.com/2013/04/23/structuring-scalable-client-side-applications/). Druga część z tej serii polega na tym, że podzieliłem swój aktualny kod sygnału na osobny moduł czatu marionetkowego. Myślę, że to tam się zawodzi. Nie można uzyskać tej drugiej zależności, automatycznie wygenerowanego skryptu, do tego osobnego modułu czatu. Zobacz moją edycję. – Robert

+2

Bez względu na to, czy organizacja kodu po stronie klienta i technologia, z której korzystasz, powinna działać. Trudną częścią (napotkałem ten sam problem podczas integracji signalr) jest automatycznie generowany plik, który można obejść, dodając? na końcu, aby zapobiec wymaganiom programu require.js. Próbowałem także wtyczkę z tekstem, ale nie miałem szczęścia. Podejście, które zasugerowałem, zasugerował mi inny pracownik SO. Podkładki i ścieżki Require.js są naprawdę potężne, aby opisać zależności między modułami nie zapisanymi w trybie require.js, a dla własnych modułów powinieneś być w porządku, po prostu definiując je poprawnie. –

+0

Spróbowałbym odejść od prostego scenariusza i powoli wprowadzać więcej komplikacji, aby uzyskać wyobrażenie o miejscu, w którym coś się nie udaje. SignalR może współpracować z Require.js, tak naprawdę pracuję w projekcie. Chyba niż odpowiada na twoje pytanie. –

2

skonfigurować RequireJS powodzeniem stosując roztwór @ raciel-R, ale ja nadal występują problemy z innymi modułami JavaScript, takich jak karmy, które również zostały pomylone przez dynamiczny pełnomocnika. I konwertowane proxy signalr do pliku statycznego i używane, które z RequireJS Zamiast:

  1. importu 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 gdzie /my/bin jest katalog zawierający zespoły ze swoim SignalR Piast.

  3. Wymień swoje odniesienie do /signalr/hubs z server:

    requirejs.config({   
    paths: { 
        // ... 
        "signalr.hubs": "path/to/scripts/server" 
    }, 
    // .... 
    
  4. Jeśli używasz metody wygody wygenerowanym pełnomocnika, trzeba również je przepisać (patrz How to create a physical file for the SignalR generated proxy)

Powiązane problemy