Rozwiązywanie problemów z usługą SignalR (SignalR 1.x)

Autor : Patrick Fletcher

Ostrzeżenie

Ta dokumentacja nie jest przeznaczona dla najnowszej wersji usługi SignalR. Przyjrzyj się ASP.NET Core SignalR.

W tym dokumencie opisano typowe problemy z rozwiązywaniem problemów z usługą SignalR.

Ten dokument zawiera następujące sekcje.

Wywoływanie metod między klientem a serwerem w trybie dyskretnym kończy się niepowodzeniem

W tej sekcji opisano możliwe przyczyny niepowodzenia wywołania metody między klientem a serwerem bez istotnego komunikatu o błędzie. W aplikacji SignalR serwer nie ma informacji o metodach implementujących przez klienta; gdy serwer wywołuje metodę klienta, nazwa metody i dane parametrów są wysyłane do klienta, a metoda jest wykonywana tylko wtedy, gdy istnieje w formacie określonym przez serwer. Jeśli na kliencie nie zostanie znaleziona żadna zgodna metoda, nic się nie stanie i na serwerze nie zostanie zgłoszony żaden komunikat o błędzie.

Aby dokładniej zbadać metody klienta, które nie są wywoływane, możesz włączyć rejestrowanie przed wywołaniem metody start w centrum, aby zobaczyć, jakie wywołania pochodzą z serwera. Aby włączyć rejestrowanie w aplikacji JavaScript, zobacz Jak włączyć rejestrowanie po stronie klienta (wersja klienta JavaScript). Aby włączyć rejestrowanie w aplikacji klienckiej platformy .NET, zobacz Jak włączyć rejestrowanie po stronie klienta (wersja klienta.NET Client).

Błędna metoda, nieprawidłowa sygnatura metody lub nieprawidłowa nazwa centrum

Jeśli nazwa lub podpis wywoływanej metody nie jest dokładnie zgodna z odpowiednią metodą na kliencie, wywołanie zakończy się niepowodzeniem. Sprawdź, czy nazwa metody wywoływana przez serwer jest zgodna z nazwą metody na kliencie. Ponadto usługa SignalR tworzy serwer proxy koncentratora przy użyciu metod camel-cased, zgodnie z potrzebami w języku JavaScript, więc metoda wywołana SendMessagesendMessage na serwerze proxy klienta. Jeśli używasz atrybutu HubName w kodzie po stronie serwera, sprawdź, czy używana nazwa jest zgodna z nazwą używaną do utworzenia centrum na kliencie. Jeśli nie używasz atrybutu HubName , sprawdź, czy nazwa centrum w kliencie JavaScript jest wielbłądowana, na przykład chatHub zamiast ChatHub.

Zduplikowana nazwa metody na kliencie

Sprawdź, czy na kliencie nie ma zduplikowanego metody, która różni się tylko wielkością liter. Jeśli aplikacja kliencka ma metodę o nazwie sendMessage, sprawdź, czy nie istnieje również metoda wywoływana SendMessage .

Brak analizatora JSON na kliencie

Usługa SignalR wymaga, aby analizator JSON był obecny w celu serializacji wywołań między serwerem a klientem. Jeśli klient nie ma wbudowanego analizatora JSON (takiego jak Internet Explorer 7), musisz dołączyć go do aplikacji. Analizator JSON można pobrać tutaj.

Mieszanie składni Hub i PersistentConnection

Usługa SignalR używa dwóch modeli komunikacji: koncentratory i trwałełączniki. Składnia wywoływania tych dwóch modeli komunikacji różni się w kodzie klienta. Jeśli dodano koncentrator w kodzie serwera, sprawdź, czy cały kod klienta używa odpowiedniej składni centrum.

Kod klienta języka JavaScript, który tworzy trwałe połączenie w kliencie JavaScript

var myConnection = $.connection('/echo');

Kod klienta JavaScript, który tworzy serwer proxy centrum w kliencie JavaScript

var myHub = $.connection.MyHub;

Kod serwera języka C#, który mapuje trasę na trwałepołączenie

RouteTable.Routes.MapConnection<MyConnection>("my", "/echo");

Kod serwera C#, który mapuje trasę do centrum lub do wielu centrów, jeśli masz wiele aplikacji

RouteTable.Routes.MapHubs();

Połączenie rozpoczęte przed dodaniu subskrypcji

Jeśli połączenie centrum zostanie uruchomione, zanim metody, które można wywołać z serwera, zostaną dodane do serwera proxy, komunikaty nie zostaną odebrane. Następujący kod JavaScript nie uruchomi centrum prawidłowo:

Nieprawidłowy kod klienta JavaScript, który nie zezwala na odbieranie komunikatów usługi Hubs

var chat = $.connection.chatHub;
$.connection.hub.start().done(function () {
    chat.client.broadcastMessage = function (name, message) {...};
});

Zamiast tego dodaj subskrypcje metody przed wywołaniem polecenia Start:

Kod klienta javaScript, który poprawnie dodaje subskrypcje do centrum

var chat = $.connection.chatHub;
chat.client.broadcastMessage = function (name, message) {...};
    $.connection.hub.start().done(function () {
        ...
    });

Brak nazwy metody na serwerze proxy centrum

Sprawdź, czy metoda zdefiniowana na serwerze jest subskrybowana na kliencie. Mimo że serwer definiuje metodę, należy ją nadal dodać do serwera proxy klienta. Metody można dodać do serwera proxy klienta na następujące sposoby (należy pamiętać, że metoda jest dodawana do client elementu członkowskiego koncentratora, a nie bezpośrednio centrum):

Kod klienta JavaScript, który dodaje metody do serwera proxy centrum

// Method added to proxy in JavaScript:
myHubProxy.server.method1 = function (param1, param2) {...};
//Multiple methods added to proxy in JavaScript using jQuery:
$.extend(myHubProxy.server, {
    method1: function (param1, param2) {...},
    method2: function (param3, param4) {...}
});

Metody centrum lub centrum nie są deklarowane jako publiczne

Aby być widocznym na kliencie, implementacja centrum i metody muszą być zadeklarowane jako public.

Uzyskiwanie dostępu do centrum z innej aplikacji

Dostęp do usługi SignalR Hubs można uzyskać tylko za pośrednictwem aplikacji implementujących klientów usługi SignalR. Usługa SignalR nie może współdziałać z innymi bibliotekami komunikacyjnymi (takimi jak usługi internetowe SOAP lub WCF). Jeśli nie ma dostępnego klienta usługi SignalR dla platformy docelowej, nie możesz uzyskać bezpośredniego dostępu do punktu końcowego serwera.

Ręczne serializowanie danych

Usługa SignalR automatycznie użyje formatu JSON do serializacji parametrów metody — nie trzeba tego robić samodzielnie.

Metoda centrum zdalnego nie jest wykonywana na kliencie w funkcji OnDisconnected

To zachowanie jest celowe. Po OnDisconnected wywołaniu centrum wprowadziło Disconnected już stan, który nie zezwala na wywoływanie dalszych metod piasty.

Kod serwera C#, który poprawnie wykonuje kod w zdarzeniu OnDisconnected

public class MyHub : Hub
{
    public override Task OnDisconnected()
    {
        // Do what you want here
        return base.OnDisconnected();
    }
}

Osiągnięto limit połączeń

W przypadku korzystania z pełnej wersji usług IIS w systemie operacyjnym klienta, takiego jak Windows 7, nakładany jest limit połączeń 10. W przypadku korzystania z systemu operacyjnego klienta użyj IIS Express zamiast tego, aby uniknąć tego limitu.

Połączenie między domenami nie jest poprawnie skonfigurowane

Jeśli połączenie między domenami (połączenie, dla którego adres URL usługi SignalR nie znajduje się w tej samej domenie co strona hostingu), nie jest poprawnie skonfigurowane, połączenie może zakończyć się niepowodzeniem bez komunikatu o błędzie. Aby uzyskać informacje na temat włączania komunikacji między domenami, zobacz Jak nawiązać połączenie między domenami.

Połączenie przy użyciu protokołu NTLM (Active Directory) nie działa w kliencie platformy .NET

Połączenie w aplikacji klienckiej platformy .NET korzystającej z zabezpieczeń domeny może zakończyć się niepowodzeniem, jeśli połączenie nie jest poprawnie skonfigurowane. Aby użyć usługi SignalR w środowisku domeny, ustaw wymaganą właściwość połączenia w następujący sposób:

Kod klienta języka C# implementujący poświadczenia połączenia

connection.Credentials = CredentialCache.DefaultCredentials;

Inne problemy z połączeniami

W tej sekcji opisano przyczyny i rozwiązania określonych objawów lub komunikatów o błędach występujących podczas połączenia.

Błąd "Uruchamianie musi być wywoływane przed wysłaniem danych"

Ten błąd jest często spotykany, jeśli kod odwołuje się do obiektów SignalR przed rozpoczęciem połączenia. Połączenie dla programów obsługi i takich metod wywoła metody zdefiniowane na serwerze należy dodać po zakończeniu połączenia. Należy pamiętać, że wywołanie metody jest Start asynchroniczne, więc kod po wywołaniu może zostać wykonany przed jego ukończeniem. Najlepszym sposobem dodawania procedur obsługi po całkowitym uruchomieniu połączenia jest umieszczenie ich w funkcji wywołania zwrotnego przekazywanej jako parametr do metody startowej:

Kod klienta JavaScript, który poprawnie dodaje programy obsługi zdarzeń odwołujące się do obiektów signalR

$.connection.hub.start().done(function () {
    // Wire up Send button to call NewContosoChatMessage on the server.
    $('#newContosoChatMessage').click(function () {
        contosoChatHubProxy.server.newContosoChatMessage(
            $('#displayname').val(), $('#message').val());
            $('#message').val('').focus();
    });

Ten błąd będzie również widoczny, jeśli połączenie zostanie zatrzymane, gdy obiekty usługi SignalR są nadal przywoływane.

Błąd "301 Przeniesiono trwale" lub "302 Przeniesiono tymczasowo"

Ten błąd może być widoczny, jeśli projekt zawiera folder o nazwie SignalR, który będzie zakłócać automatycznie utworzony serwer proxy. Aby uniknąć tego błędu, nie używaj folderu o nazwie SignalR w aplikacji ani wyłączaj automatycznego generowania serwera proxy. Aby uzyskać więcej informacji, zobacz Wygenerowany serwer proxy i co to robi .

Błąd "403 Zabronione" na platformie .NET lub kliencie Silverlight

Ten błąd może wystąpić w środowiskach między domenami, w których komunikacja między domenami nie jest poprawnie włączona. Aby uzyskać informacje na temat włączania komunikacji między domenami, zobacz Jak nawiązać połączenie między domenami. Aby ustanowić połączenie między domenami w kliencie programu Silverlight, zobacz Połączenia między domenami z klientów programu Silverlight.

Błąd "404 Nie znaleziono"

Istnieje kilka przyczyn tego problemu. Sprawdź wszystkie następujące elementy:

  • Odwołanie do adresu proxy centrum nie zostało poprawnie sformatowane: Ten błąd jest często spotykany, jeśli odwołanie do wygenerowanego adresu serwera proxy centrum nie jest poprawnie sformatowane. Sprawdź, czy odwołanie do adresu koncentratora zostało wykonane prawidłowo. Aby uzyskać szczegółowe informacje, zobacz Jak odwoływać się do dynamicznie wygenerowanego serwera proxy .
  • Dodawanie tras do aplikacji przed dodaniem trasy koncentratora: Jeśli aplikacja używa innych tras, sprawdź, czy pierwsza dodana trasa jest wywołaniem metody MapHubs.

"500 Wewnętrzny błąd serwera"

Jest to bardzo ogólny błąd, który może mieć szeroką gamę przyczyn. Szczegóły błędu powinny pojawić się w dzienniku zdarzeń serwera lub można je znaleźć za pośrednictwem debugowania serwera. Bardziej szczegółowe informacje o błędach można uzyskać, włączając szczegółowe błędy na serwerze. Aby uzyskać więcej informacji, zobacz Jak obsługiwać błędy w klasie Hub.

Błąd "TypeError: <hubType> jest niezdefiniowany"

Ten błąd spowoduje, że wywołanie metody MapHubs nie zostanie wykonane poprawnie. Aby uzyskać więcej informacji, zobacz Jak zarejestrować trasę usługi SignalR i skonfigurować opcje usługi SignalR .

JsonSerializationException nieobsługiwany przez kod użytkownika

Sprawdź, czy parametry wysyłane do metod nie obejmują typów niesyserowalnych (takich jak dojścia plików lub połączeń bazy danych). Jeśli musisz używać elementów członkowskich w obiekcie po stronie serwera, którego nie chcesz wysyłać do klienta (z powodów zabezpieczeń lub ze względu na serializacji), użyj atrybutu JSONIgnore .

Błąd "Błąd protokołu: Nieznany transport"

Ten błąd może wystąpić, jeśli klient nie obsługuje transportu używanych przez usługi SignalR. Zobacz Transports and Fallbacks (Transports and Fallbacks), aby uzyskać informacje o tym, które przeglądarki mogą być używane z usługą SignalR.

"Generowanie serwera proxy usługi JavaScript Hub zostało wyłączone".

Ten błąd wystąpi, jeśli DisableJavaScriptProxies zostanie ustawiony, a także odwołanie do dynamicznie wygenerowanego serwera proxy pod adresem signalr/hubs. Aby uzyskać więcej informacji na temat ręcznego tworzenia serwera proxy, zobacz Wygenerowany serwer proxy i co to robi.

Błąd "Identyfikator połączenia jest w nieprawidłowym formacie" lub "Tożsamość użytkownika nie może ulec zmianie podczas aktywnego połączenia usługi SignalR"

Ten błąd może być widoczny, jeśli jest używane uwierzytelnianie, a klient jest wylogowany przed zatrzymaniem połączenia. Rozwiązaniem jest zatrzymanie połączenia usługi SignalR przed wylogowaniem klienta.

"Błąd nieuchwycony: SignalR: nie znaleziono zapytania jQuery. Upewnij się, że odwołanie do zapytania jQuery zostało odwołane przed błędem pliku SignalR.js

Klient języka JavaScript usługi SignalR wymaga uruchomienia zapytania jQuery. Sprawdź, czy odwołanie do biblioteki jQuery jest poprawne, czy użyta ścieżka jest prawidłowa, a odwołanie do biblioteki jQuery znajduje się przed odwołaniem do usługi SignalR.

Błąd "Uncaught TypeError: Nie można odczytać właściwości "<property>" niezdefiniowanego"

Ten błąd wynika z nieprawidłowego odwołania do serwera proxy jQuery lub serwera proxy centrów. Sprawdź, czy odwołanie do biblioteki jQuery i serwera proxy centrów jest poprawne, czy użyta ścieżka jest prawidłowa, a odwołanie do zapytania jQuery jest przed odwołaniem do serwera proxy koncentratorów. Domyślne odwołanie do serwera proxy centrów powinno wyglądać następująco:

Kod po stronie klienta HTML, który poprawnie odwołuje się do serwera proxy usługi Hubs

<script src="/signalr/hubs"></script>

Błąd "RuntimeBinderException został nieobsługiwany przez kod użytkownika"

Ten błąd może wystąpić, gdy używane jest nieprawidłowe przeciążenie Hub.On . Jeśli metoda ma wartość zwracaną, typ zwracany musi być określony jako parametr typu ogólnego:

Metoda zdefiniowana na kliencie (bez wygenerowanego serwera proxy)

MyHub.On<ReturnType>("MethodName", LocalMethod);

Identyfikator połączenia jest niespójny lub przerwy połączeń między ładowaniem strony

To zachowanie jest celowe. Ponieważ obiekt koncentratora jest hostowany w obiekcie strony, centrum jest niszczone po odświeżeniu strony. Aplikacja wielostronicowa musi zachować skojarzenie między użytkownikami i identyfikatorami połączeń, aby były spójne między ładowaniem strony. Identyfikatory połączeń można przechowywać na serwerze w ConcurrentDictionary obiekcie lub bazie danych.

Błąd "Wartość nie może być równa null"

Metody po stronie serwera z opcjonalnymi parametrami nie są obecnie obsługiwane; jeśli opcjonalny parametr zostanie pominięty, metoda zakończy się niepowodzeniem. Aby uzyskać więcej informacji, zobacz Parametry opcjonalne.

Błąd "Firefox nie może nawiązać połączenia z serwerem pod <adresem>" w firebug

Ten komunikat o błędzie można zobaczyć w firebug, jeśli negocjacje transportu protokołu WebSocket kończą się niepowodzeniem, a inny transport jest używany zamiast tego. To zachowanie jest celowe.

Błąd "Certyfikat zdalny jest nieprawidłowy zgodnie z procedurą weryfikacji" w aplikacji klienckiej platformy .NET

Jeśli serwer wymaga niestandardowych certyfikatów klienta, możesz dodać certyfikat x509certificate do połączenia przed wykonaniem żądania. Dodaj certyfikat do połączenia przy użyciu polecenia Connection.AddClientCertificate.

Połączenie spada po upływie limitu czasu uwierzytelniania

To zachowanie jest celowe. Nie można modyfikować poświadczeń uwierzytelniania, gdy połączenie jest aktywne; aby odświeżyć poświadczenia, połączenie musi zostać zatrzymane i uruchomione ponownie.

Połączenie onConnected jest wywoływane dwa razy w przypadku korzystania z usługi jQuery Mobile

Funkcja jQuery Mobile initializePage wymusza ponowne wykonanie skryptów na każdej stronie, co powoduje utworzenie drugiego połączenia. Rozwiązania tego problemu obejmują:

  • Dołącz odwołanie do aplikacji jQuery Mobile przed plikiem JavaScript.
  • initializePage Wyłącz funkcję, ustawiając wartość $.mobile.autoInitializePage = false.
  • Poczekaj na zakończenie inicjowania strony przed rozpoczęciem połączenia.

Komunikaty są opóźnione w aplikacjach Silverlight przy użyciu zdarzeń wysłanych przez serwer

Komunikaty są opóźnione podczas korzystania z zdarzeń wysyłanych przez serwer w programie Silverlight. Aby wymusić użycie długiego sondowania, użyj następującego polecenia podczas uruchamiania połączenia:

connection.Start(new LongPollingTransport());

"Odmowa uprawnień" przy użyciu protokołu Forever Frame

Jest to znany problem opisany tutaj. Ten objaw może być widoczny przy użyciu najnowszej biblioteki JQuery; obejście polega na obniżeniu poziomu aplikacji na JQuery 1.8.2.

Błędy kompilacji i po stronie serwera

Poniższa sekcja zawiera możliwe rozwiązania błędów środowiska uruchomieniowego kompilatora i serwera.

Odwołanie do wystąpienia centrum ma wartość null

Ponieważ wystąpienie centrum jest tworzone dla każdego połączenia, nie można samodzielnie utworzyć wystąpienia centrum w kodzie. Aby wywołać metody w centrum spoza samego centrum, zobacz Jak wywoływać metody klienta i zarządzać grupami spoza klasy Hub , aby uzyskać odwołanie do kontekstu centrum.

HttpContext.Current.Session ma wartość null

To zachowanie jest celowe. Usługa SignalR nie obsługuje stanu sesji ASP.NET, ponieważ włączenie stanu sesji spowoduje przerwanie obsługi komunikatów dwukierunkowych.

Brak odpowiedniej metody przesłonięcia

Ten błąd może wystąpić, jeśli używasz kodu ze starszej dokumentacji lub blogów. Sprawdź, czy nie odwołujesz się do nazw metod, które zostały zmienione lub przestarzałe (na przykład OnConnectedAsync).

HostContextExtensions.WebSocketServerUrl ma wartość null

To zachowanie jest celowe. Ten element członkowski jest przestarzały i nie powinien być używany.

Błąd "Trasa o nazwie "signalr.hubs" znajduje się już w kolekcji tras

Ten błąd będzie widoczny, jeśli MapHubs jest wywoływany dwa razy przez aplikację. Niektóre przykładowe aplikacje są wywoływane MapHubs bezpośrednio w pliku aplikacji globalnej. Inne tworzą wywołanie w klasie otoki. Upewnij się, że aplikacja nie wykonuje obu tych czynności.

Problemy z programem Visual Studio

W tej sekcji opisano problemy napotkane w programie Visual Studio.

Węzeł Dokumenty skryptu nie jest wyświetlany w Eksplorator rozwiązań

Niektóre z naszych samouczków kierują Cię do węzła "Dokumenty skryptowe" w Eksplorator rozwiązań podczas debugowania. Ten węzeł jest generowany przez debuger języka JavaScript i będzie wyświetlany tylko podczas debugowania klientów przeglądarki w programie Internet Explorer; węzeł nie będzie wyświetlany, jeśli są używane przeglądarki Chrome lub Firefox. Debuger języka JavaScript również nie zostanie uruchomiony, jeśli jest uruchomiony inny debuger klienta, taki jak debuger programu Silverlight.

Usługa SignalR nie działa w programie Visual Studio 2008 lub starszym

To zachowanie jest celowe. Usługa SignalR wymaga .NET Framework 4 lub nowszej. Wymaga to opracowania aplikacji SignalR w programie Visual Studio 2010 lub nowszym.

Problemy z usługami IIS

Ta sekcja zawiera problemy z usługami Internet Information Services.

Witryna internetowa ulega awarii po wywołaniu usługi MapHubs

Ten problem został rozwiązany w najnowszej wersji usługi SignalR. Sprawdź, czy używasz najnowszej wydanej wersji usługi SignalR, aktualizując instalację przy użyciu narzędzia NuGet.

Problemy z platformą Azure

Ta sekcja zawiera problemy z platformą Microsoft Azure.

Komunikaty nie są odbierane za pośrednictwem planu zaplecza platformy Azure po zmianie nazw tematów

Tematy używane przez plan zaplecza platformy Azure nie są przeznaczone do konfigurowania przez użytkownika.