Sdílet prostřednictvím


Řešení potíží s knihovnou SignalR (SignalR 1.x)

Patrick Fletcher

Upozornění

Tato dokumentace není určená pro nejnovější verzi služby SignalR. Podívejte se na ASP.NET Core SignalR.

Tento dokument popisuje běžné řešení potíží se službou SignalR.

Tento dokument obsahuje následující části.

Volání metod mezi klientem a serverem bezobslužně selže

Tato část popisuje možné příčiny selhání volání metody mezi klientem a serverem bez smysluplné chybové zprávy. V aplikaci SignalR server nemá žádné informace o metodách, které klient implementuje. Když server vyvolá metodu klienta, název metody a data parametru jsou odeslány klientovi a metoda se spustí pouze v případě, že existuje ve formátu zadaném serverem. Pokud se na klientovi nenajde žádná odpovídající metoda, nic se nestane a na serveru se nevygeneruje žádná chybová zpráva.

Pokud chcete podrobněji prozkoumat metody klienta, které se nevolají, můžete před voláním metody Start v centru zapnout protokolování a zjistit, jaká volání přicházejí ze serveru. Pokud chcete povolit protokolování v javascriptové aplikaci, přečtěte si téma Jak povolit protokolování na straně klienta (verze klienta JavaScriptu). Pokud chcete povolit protokolování v klientské aplikaci .NET, přečtěte si téma Postup povolení protokolování na straně klienta (verze klienta .NET).

Chybně napsaná metoda, nesprávná signatura metody nebo nesprávný název centra

Pokud název nebo podpis volané metody přesně neodpovídá příslušné metodě na klientovi, volání se nezdaří. Ověřte, že název metody volaný serverem odpovídá názvu metody na klientovi. SignalR také vytvoří proxy rozbočovače pomocí metod s camel case, jak je to vhodné v JavaScriptu, takže metoda volaná SendMessage na serveru by byla volána sendMessage v proxy serveru klienta. Pokud v kódu na straně serveru použijete HubName atribut , ověřte, že použitý název odpovídá názvu použitému k vytvoření centra v klientovi. Pokud atribut nepoužíváte HubName , ověřte, že název centra v javascriptovém klientovi je velbloudí, například chatHub místo ChatHub.

Duplicitní název metody na klientovi

Ověřte, že na klientovi nemáte duplicitní metodu, která se liší pouze případem. Pokud má vaše klientská aplikace metodu s názvem sendMessage, ověřte, že neexistuje také volaná SendMessage metoda.

Chybějící analyzátor JSON v klientovi

SignalR vyžaduje, aby byl k dispozici analyzátor JSON pro serializaci volání mezi serverem a klientem. Pokud váš klient nemá integrovaný analyzátor JSON (například Internet Explorer 7), budete ho muset do aplikace zahrnout. Analyzátor JSON si můžete stáhnout tady.

Kombinování syntaxe Centra a PersistentConnection

SignalR používá dva modely komunikace: Hubs a PersistentConnections. Syntaxe volání těchto dvou komunikačních modelů se v klientském kódu liší. Pokud jste do kódu serveru přidali centrum, ověřte, že veškerý kód klienta používá správnou syntaxi centra.

Kód klienta JavaScriptu, který vytvoří PersistentConnection v klientovi JavaScriptu

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

Kód klienta JavaScriptu, který vytvoří proxy centrum v javascriptovém klientovi

var myHub = $.connection.MyHub;

Kód serveru C#, který mapuje trasu na PersistentConnection

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

Kód serveru C#, který mapuje trasu do centra nebo do více center, pokud máte více aplikací

RouteTable.Routes.MapHubs();

Připojení se spustilo před přidání předplatných.

Pokud je připojení centra spuštěno před přidání metod, které lze volat ze serveru do proxy serveru, zprávy nebudou přijaty. Následující kód JavaScriptu nespustí centrum správně:

Nesprávný kód klienta JavaScriptu, který neumožňuje příjem zpráv služby Hubs

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

Místo toho před voláním startu přidejte odběry metod:

Kód klienta JavaScriptu, který správně přidává předplatná do centra

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

Na proxy serveru centra chybí název metody.

Ověřte, že je metoda definovaná na serveru přihlášená k odběru na klientovi. I když server definuje metodu , musí být stále přidána do proxy serveru klienta. Metody je možné do klientského proxy serveru přidat následujícími způsoby (všimněte si, že metoda se přidává do client člena centra, ne přímo do centra):

Kód klienta JavaScriptu, který přidává metody do proxy serveru centra

// 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 centra nebo centra nejsou deklarovány jako veřejné

Aby byly na klientovi viditelné, musí být implementace a metody centra deklarovány jako public.

Přístup k centru z jiné aplikace

Ke službě SignalR Hub je možné přistupovat pouze prostřednictvím aplikací, které implementují klienty SignalR. SignalR nemůže spolupracovat s jinými komunikačními knihovnami (jako jsou webové služby SOAP nebo WCF). Pokud pro cílovou platformu není k dispozici žádný klient SignalR, nemůžete získat přímý přístup ke koncovému bodu serveru.

Ruční serializace dat

SignalR automaticky použije json k serializaci parametrů metody – nemusíte to dělat sami.

Metoda vzdáleného centra se na klientovi nespustí ve funkci OnDisconnected

Toto chování je záměrné. Když OnDisconnected je volána, centrum již vstoupilo do Disconnected stavu, který neumožňuje volat další metody centra.

Kód serveru C#, který správně spouští kód v události OnDisconnected

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

Dosažení limitu počtu připojení

Při použití plné verze služby IIS v klientském operačním systému, jako je Windows 7, je nastaven limit 10 připojení. Pokud používáte klientský operační systém, použijte místo toho IIS Express, abyste se tomuto limitu vyhnuli.

Mezidoménové připojení není správně nastavené

Pokud není správně nastaveno připojení mezi doménou (připojení, pro které není adresa URL služby SignalR ve stejné doméně jako hostitelská stránka), může připojení selhat bez chybové zprávy. Informace o tom, jak povolit komunikaci mezi doménou, najdete v tématu Jak navázat připojení mezi doménou.

Připojení pomocí protokolu NTLM (Active Directory) nefunguje v klientovi .NET

Připojení v klientské aplikaci .NET, která používá zabezpečení domény, může selhat, pokud připojení není správně nakonfigurované. Pokud chcete službu SignalR používat v doménovém prostředí, nastavte požadovanou vlastnost připojení následujícím způsobem:

Kód klienta C#, který implementuje přihlašovací údaje pro připojení

connection.Credentials = CredentialCache.DefaultCredentials;

Jiné problémy s připojením

Tato část popisuje příčiny a řešení konkrétních příznaků nebo chybových zpráv, ke kterým dochází během připojení.

Chyba "Před odesláním dat musí být volána možnost Start"

K této chybě často dochází, pokud kód odkazuje na objekty SignalR před zahájením připojení. Po dokončení připojení musí být přidáno připojení pro obslužné rutiny a podobné metody, které budou volat metody definované na serveru. Všimněte si, že volání Start metody je asynchronní, takže kód po volání může být spuštěn před jeho dokončením. Nejlepší způsob, jak přidat obslužné rutiny po úplném spuštění připojení, je vložit je do funkce zpětného volání, která se předá jako parametr metodě start:

Kód klienta JavaScriptu, který správně přidává obslužné rutiny událostí, které odkazují na objekty 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();
    });

Tato chyba se zobrazí také v případě, že se připojení zastaví, zatímco se stále odkazuje na objekty SignalR.

Chyba "301 trvale přesunuto" nebo "302 přesunuto dočasně"

K této chybě může dojít, pokud projekt obsahuje složku s názvem SignalR, která bude kolidovat s automaticky vytvořeným proxy serverem. Chcete-li se této chybě vyhnout, nepoužívejte v aplikaci složku s názvem SignalR nebo vypněte automatické generování proxy. Další podrobnosti najdete v tématu Vygenerovaný proxy server a jeho funkce .

Chyba 403 Zakázáno v klientovi .NET nebo Silverlight

K této chybě může dojít v prostředích mezi doménou, kde není správně povolená komunikace mezi doménou. Informace o tom, jak povolit komunikaci mezi doménou, najdete v tématu Jak navázat připojení mezi doménou. Pokud chcete v klientovi Silverlight navázat připojení mezi doménou, přečtěte si téma Připojení mezi doménou z klientů Silverlight.

Chyba 404 Nenalezena

Tento problém má několik příčin. Ověřte všechny následující:

  • Odkaz na adresu proxy serveru centra není správně naformátovaný: K této chybě často dochází v případě, že odkaz na vygenerovanou adresu proxy centra není správně naformátovaný. Ověřte, že je správně proveden odkaz na adresu centra. Podrobnosti najdete v tématu Odkazování na dynamicky generovaný proxy server .
  • Přidání tras do aplikace před přidáním trasy centra: Pokud vaše aplikace používá jiné trasy, ověřte, že první přidaná trasa je voláním MapHubs.

"500 Vnitřní chyba serveru"

Jedná se o velmi obecnou chybu, která může mít širokou škálu příčin. Podrobnosti o chybě by se měly zobrazit v protokolu událostí serveru nebo je můžete najít prostřednictvím ladění serveru. Podrobnější informace o chybách můžete získat zapnutím podrobných chyb na serveru. Další informace najdete v tématu Zpracování chyb ve třídě Hub.

Chyba TypeError: <hubType> is undefined

K této chybě dojde, MapHubs pokud volání není provedeno správně. Další informace najdete v tématu Postup registrace trasy SignalR a konfigurace možností služby SignalR .

JsonSerializationException byl neošetřený uživatelským kódem

Ověřte, že parametry odesílané do metod neobsahují typy, které nelze serializovat (jako jsou popisovače souborů nebo připojení k databázi). Pokud potřebujete použít členy na objektu na straně serveru, který nechcete odesílat klientovi (z důvodu zabezpečení nebo kvůli serializaci), použijte JSONIgnore atribut .

Chyba protokolu: Neznámý přenos

K této chybě může dojít, pokud klient nepodporuje přenosy, které používá SignalR. Informace o tom, které prohlížeče lze se službou SignalR používat, najdete v tématu Přenosy a záložní služby.

"Generování proxy serveru JavaScript Hub bylo zakázáno."

K této chybě dojde, pokud DisableJavaScriptProxies je nastavena a zároveň obsahuje odkaz na dynamicky generovaný proxy server na adrese signalr/hubs. Další informace o ručním vytvoření proxy serveru najdete v tématu vygenerovaný proxy server a jeho funkce.

Chyba "ID připojení je v nesprávném formátu" nebo "Identita uživatele se nemůže změnit během aktivního připojení SignalR"

K této chybě může dojít, pokud se používá ověřování a klient je před zastavením připojení odhlášený. Řešením je zastavit připojení SignalR před odhlášením klienta.

"Nezachycená chyba: SignalR: jQuery nebyl nalezen. Ujistěte se, že se před chybou SignalR.js souboru odkazuje na jQuery.

JavaScriptový klient SignalR vyžaduje spuštění jQuery. Ověřte, že odkaz na jQuery je správný, jestli je použitá cesta platná a jestli je odkaz na jQuery před odkazem na SignalR.

Chyba "Nezachycená chyba TypeError: Nelze přečíst vlastnost< 'vlastnost>' nedefinované"

Tato chyba je důsledkem toho, že se správně neodkazuje na jQuery nebo proxy serveru hubs. Ověřte, že odkaz na jQuery a proxy serveru hubs je správný, že použitá cesta je platná a že odkaz na jQuery je před odkazem na proxy serveru hubs. Výchozí odkaz na proxy serveru hubs by měl vypadat takto:

Kód HTML na straně klienta, který správně odkazuje na proxy server Hubs

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

Chyba RuntimeBinderException byl neošetřený uživatelským kódem

K této chybě může dojít při použití nesprávného Hub.On přetížení. Pokud má metoda návratovou hodnotu, musí být návratový typ zadán jako parametr obecného typu:

Metoda definovaná v klientovi (bez vygenerovaného proxy serveru)

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

ID připojení je nekonzistentní nebo přerušení připojení mezi načtením stránky

Toto chování je záměrné. Vzhledem k tomu, že objekt centra je hostovaný v objektu stránky, centrum se při aktualizaci stránky zničí. Vícestránková aplikace musí udržovat přidružení mezi uživateli a ID připojení, aby byly konzistentní mezi načítáním stránek. ID připojení mohou být uložena na serveru v objektu ConcurrentDictionary nebo databázi.

Chyba Hodnota nemůže být null

Metody na straně serveru s volitelnými parametry se v současné době nepodporují. Pokud je volitelný parametr vynechán, metoda selže. Další informace najdete v tématu Volitelné parametry.

Chyba "Firefox nemůže navázat připojení k serveru na <adrese>" ve Firebugu

Tato chybová zpráva může být zobrazena v Firebug, pokud vyjednávání o přenosu WebSocket selže a místo toho se použije jiný přenos. Toto chování je záměrné.

Chyba "Vzdálený certifikát je neplatný podle ověřovací procedury" v klientské aplikaci .NET

Pokud váš server vyžaduje vlastní klientské certifikáty, můžete před vytvořením požadavku přidat certifikát x509 do připojení. Přidejte certifikát do připojení pomocí Connection.AddClientCertificate.

Po vypršení časového limitu ověřování se připojení přeruší

Toto chování je záměrné. Přihlašovací údaje ověřování nelze změnit, pokud je připojení aktivní; pokud chcete aktualizovat přihlašovací údaje, musí se připojení zastavit a restartovat.

OnConnected se zavolá dvakrát při použití jQuery Mobile

Funkce jQuery Mobile initializePage vynutí opětovné spuštění skriptů na každé stránce, čímž se vytvoří druhé připojení. Řešení tohoto problému zahrnují:

  • Před soubor JavaScriptu uveďte odkaz na jQuery Mobile.
  • initializePage Zakažte funkci nastavením $.mobile.autoInitializePage = false.
  • Před zahájením připojení počkejte, až se dokončí inicializace stránky.

Zprávy jsou zpožděné v aplikacích Silverlight pomocí událostí odeslaných serverem

Zprávy jsou zpožděné při použití událostí odeslaných serverem v silverlightu. Pokud chcete místo toho vynutit použití dlouhého dotazování, při spouštění připojení použijte následující:

connection.Start(new LongPollingTransport());

"Oprávnění odepřeno" pomocí protokolu Forever Frame

Jedná se o známý problém, který je popsaný tady. Tento příznak může být vidět pomocí nejnovější knihovny JQuery; Alternativním řešením je downgradovat aplikaci na JQuery 1.8.2.

Chyby kompilace a serveru

Následující část obsahuje možná řešení chyb kompilátoru a modulu runtime na straně serveru.

Odkaz na instanci centra má hodnotu null.

Vzhledem k tomu, že je instance centra vytvořená pro každé připojení, nemůžete ve svém kódu vytvořit instanci centra sami. Pokud chcete volat metody v centru mimo samotné centrum, přečtěte si téma Jak volat metody klienta a spravovat skupiny mimo třídu Hub , kde najdete informace o tom, jak získat odkaz na kontext centra.

HTTPContext.Current.Session má hodnotu null.

Toto chování je záměrné. SignalR nepodporuje stav ASP.NET relace, protože povolení stavu relace by narušovalo duplexní zasílání zpráv.

Žádná vhodná metoda k přepsání

Tato chyba se může zobrazit, pokud používáte kód ze starší dokumentace nebo blogů. Ověřte, že neodkazujete na názvy metod, které byly změněny nebo zastaralé (například OnConnectedAsync).

HostContextExtensions.WebSocketServerUrl má hodnotu null.

Toto chování je záměrné. Tento člen je zastaralý a neměl by být používán.

Chyba "Trasa s názvem signalr.hubs je již v kolekci tras"

Tato chyba se zobrazí, pokud MapHubs je aplikace volána dvakrát. Některé ukázkové aplikace volají MapHubs přímo v souboru globální aplikace; jiné volat ve třídě obálky. Ujistěte se, že vaše aplikace nedělá obojí.

Problémy se sadou Visual Studio

Tato část popisuje problémy, ke kterým dochází v sadě Visual Studio.

Uzel Dokumenty skriptu se nezobrazuje v Průzkumník řešení

Některé z našich kurzů vás při ladění nasměrují na uzel Dokumenty skriptů v Průzkumník řešení. Tento uzel je vytvořen ladicím programem JavaScriptu a zobrazí se pouze při ladění klientů prohlížeče v Internet Exploreru; uzel se nezobrazí, pokud se používá Chrome nebo Firefox. Ladicí program JavaScriptu se také nespustí, pokud je spuštěný jiný ladicí program klienta, například ladicí program Silverlight.

SignalR nefunguje v sadě Visual Studio 2008 nebo starší verzi

Toto chování je záměrné. SignalR vyžaduje rozhraní .NET Framework 4 nebo novější; To vyžaduje, aby aplikace SignalR byly vyvinuty v sadě Visual Studio 2010 nebo novější.

Problémy se službou IIS

Tato část obsahuje problémy s Internetovou informační službou.

Po volání MapHubs dojde k chybovému ukončení webu

Tento problém je opravený v nejnovější verzi SignalR. Aktualizujte instalaci pomocí NuGetu a ověřte, že používáte nejnovější vydanou verzi SignalR.

Problémy s Azure

Tato část obsahuje problémy s Microsoft Azure.

Po změně názvů témat se zprávy nepřijímají prostřednictvím backplane Azure.

Témata používaná backplanem Azure nejsou určená k tomu, aby byla konfigurovatelná uživatelem.