2013-08-12 14 views
5

Mam problemy z używaniem SignalR w istniejącej aplikacji internetowej. Otrzymuję wyjątek javaruntime "Nie można pobrać klienta" o właściwości undefined lub o wartości null ", ponieważ podczas próby pobrania mojego koncentratora z obiektu $ .connection zwracana jest wartość null.SignalR - Nie można uzyskać właściwości "klienta" o niezdefiniowanym lub zerowym numerze referencyjnym

Zanim opublikuję mój kod, chciałem dostarczyć trochę tła i kilka rzeczy, które już wypróbowałem: - Jeśli prowadzę projekt lokalnie, wszystko działa dobrze. Dopiero po wdrożeniu mojego projektu do lokalizacji IIS mam problemy. - Zweryfikowaliśmy, że nazwa mojego huba jest poprawna pod względem wielbłądów. Znowu działa dobrze lokalnie i tylko zgłasza błąd po wdrożeniu projektu do IIS. - Potwierdziłem, że mój javascript został pomyślnie załadowany. Biblioteka JQuery odwołuje się tylko raz i ładuje się poprawnie. Podobnie jak javascript signalR i dynamicznie tworzony signalr/hubs. - Jeśli utworzę nowy projekt i uruchomię ten sam kod, co nowa aplikacja internetowa działająca jako aplikacja internetowa w istniejącej aplikacji internetowej, wszystko działa poprawnie (ten sam kod jest używany tylko w nowym projekcie).

Ktoś myśli o tym, czym jest problem?

Kod Hub:

Imports Microsoft.AspNet.SignalR 

Public Class TestHub 
    Inherits Hub 

    Public Sub Connect() 
     Try 
      Clients.Caller.onConnect(Context.ConnectionId) 
     Catch ex As Exception 
      LogMessage("ERROR Connecting to Hub", 0, 0, "ERROR") 
     End Try 
    End Sub 

End Class 

Web Page Code:

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
    <script src="Scripts/jquery-1.6.4.min.js"></script> 
    <!--Reference the SignalR library. --> 
    <script src="Scripts/jquery.signalR-1.1.3.js"></script> 
    <!--Reference the autogenerated SignalR hub script. --> 
    <script src="signalr/hubs"></script> 
    <script type="text/javascript"> 
     $(function() { 
      // Declare a proxy to reference the hub. 
      var thub = $.connection.testHub; 

      registerClientMethods(thub); 

      // Start Hub 
      $.connection.hub.start().done(function() { 
       registerEvents(thub); 
       thub.server.connect(); 
       alert('connected!'); 
      }); 
     }); 


     function registerClientMethods(thub) { 
      thub.client.onConnect = function (id) { 
       $('#lblConnectionID').text(id); 
      } 
     } 

     function registerEvents() { 

     } 
    </script> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
     <asp:Label ID="lblConnectionID" runat="server" /> 
    </div> 
    </form> 
</body> 
</html> 

Kod Global.asax:

Imports System.Web.Routing 
Imports Microsoft.AspNet.SignalR 

Public Class Global_asax 
    Inherits System.Web.HttpApplication 
    Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs) 
    ' Fires when the application is started 
    Try 
    ' Register the default hubs route: ~/signalr/hubs 
    RouteTable.Routes.MapHubs() 
    Catch ex As Exception 
    LogMessage("ERROR initializing SignalR: " & ex.Message, 0, 0, "ERROR") 
    End Try 
End Sub 
... 

Więc teraz, kiedy idę do mojego widoku SignalRTest.aspx , linia thub.client.onConnected = ... wyrzuca jav błąd askryptu: "Nie można uzyskać właściwości" klienta "niezdefiniowanego lub pustego odwołania"

Czy ktoś wie, co może być przyczyną? Dziękuję.

[EDIT] - Po porównaniu roboczy plik signalr/hubs.js z nieprodukcyjnym pliku, znalazłem następujący fragment: Zanik

proxies.testHub= this.createHubProxy('testHub'); 
    proxies.testHub.client = { }; 
    proxies.testHub.server = { 
     connect: function() { 
      return proxies.transactionHub.invoke.apply(proxies.testHub, $.merge(["Connect"], $.makeArray(arguments))); 
     } 
    }; 

jakieś przemyślenia na temat tego, dlaczego nie dostanie zawarte w plik signalr/hubs.js? Dzwonię do MapHubs() w Global.asax ...

Dzięki!

[FIX] Usunąłem folder Bin mojej docelowej aplikacji sieci Web i ponownie wdrożyłem. Wciąż nie jestem pewien, co było innego. Wszystkie .DLL są takie same. Teraz działa. Dziwny.

+0

To jest trudne, można opracować na kontraście pomiędzy setup, który działa na IIS i jeden, który nie. Powiedziałeś: "jako nowa aplikacja internetowa działająca jako aplikacja internetowa w istniejącej aplikacji internetowej wszystko działa dobrze". Czym różni się to od konfiguracji w IIS, w której sygnałR nie działa? –

+0

Oczywiście, mogę spróbować ... W IIS mam aplikację internetową o nazwie "MyWebApplication". Jest to duża i skomplikowana aplikacja internetowa, która działa już od jakiegoś czasu. Dostaję się na moją stronę testową, przechodząc do http://mycompany.com/mytest/signalrtest.aspx. Z jakiegoś powodu mój serwer proxy nie jest tworzony w tym projekcie. Jeśli utworzę nowy projekt Visual Studio i nazworzę go testem2, który zawiera tylko kod signalr (koncentrator i strona klienta), wdrażam projekt jako aplikację pod moją główną aplikacją w IIS (teraz przejdę do http: // mojafirma .com/mytest/mychildtest/signalrtest.aspx). Teraz mój hub proxy generuje ok – user2676522

+0

Być może "MyWebApplication" ma pewne ustawienia bezpieczeństwa, które zablokowały niektóre z potrzebnych bibliotek ASP.NET Signalr wymaga do poprawnej pracy. Czy masz jakieś rejestrowanie aplikacji, takie jak Elmah lub Enterprise Library? Czy na wszelki wypadek sprawdziłeś dziennik zdarzeń aplikacji systemu Windows? –

Odpowiedz

4

Napotkano ten błąd podczas próby debugowania w celu uruchomienia aplikacji WWW po opublikowaniu z VS 2012 do IIS 7.5. Po kilku pociągnięciach włosów zdałem sobie sprawę, że problem polegał na tym, że nie zmieniłem skryptów jquery i ścieżek sygnałowych podczas wdrażania.

Aby rozwiązać problem, musiałem dodać nazwę katalogu wirtualnego ("TestingChat") do ścieżki znaczników skryptu dla jquery i signalr.

E.g.Z tego:

<script src="Scripts/jquery-1.8.2.min.js" ></script> 
<script src="/signalr/hubs"></script> 

Aby

<script src="/TestingChat/Scripts/jquery-1.8.2.min.js" ></script> 
<script src="TestingChat/signalr/hubs"></script> 
+1

Mój problem również - po prostu aby zakwalifikować się do uruchomienia projektu na localhost musiałem zmienić odniesienie do SSED

+1

@SSED - +1 - to samo dla mnie, ale ja było łatwiej po prostu: David

Powiązane problemy