SignalR トラブルシューティング (SignalR 1.x)

作成者: Patrick Fletcher

警告

このドキュメントは、SignalR の最新バージョン用ではありません。 SignalR の ASP.NET Coreを見てみましょう。

このドキュメントでは、SignalR に関する一般的なトラブルシューティングの問題について説明します。

このドキュメントには、次のセクションが含まれています。

クライアントとサーバー間のメソッドの呼び出しがサイレント モードで失敗する

このセクションでは、意味のあるエラー メッセージなしでクライアントとサーバー間のメソッド呼び出しが失敗する原因について説明します。 SignalR アプリケーションでは、サーバーにはクライアントが実装するメソッドに関する情報がありません。サーバーがクライアント メソッドを呼び出すと、メソッド名とパラメーター データがクライアントに送信され、サーバーが指定した形式で存在する場合にのみメソッドが実行されます。 クライアントで一致するメソッドが見つからない場合、何も起こりません。また、サーバー上でエラー メッセージは発生しません。

呼び出されないクライアント メソッドをさらに調査するには、ハブで start メソッドを呼び出す前にログを有効にして、サーバーからの呼び出しを確認できます。 JavaScript アプリケーションでログ記録を有効にするには、「 クライアント側のログ記録を有効にする方法 (JavaScript クライアント バージョン)」を参照してください。 .NET クライアント アプリケーションでログ記録を有効にするには、「 クライアント側のログ記録を有効にする方法 (.NET クライアント バージョン)」を参照してください。

メソッドのスペルが間違っている、メソッドのシグネチャが正しくない、またはハブ名が正しくない

呼び出されたメソッドの名前またはシグネチャがクライアントの適切なメソッドと正確に一致しない場合、呼び出しは失敗します。 サーバーによって呼び出されるメソッド名が、クライアント上のメソッドの名前と一致することを確認します。 また、SignalR は JavaScript で必要に応じてキャメル ケースメソッドを使用してハブ プロキシを作成するため、サーバーで呼び出される SendMessage メソッドがクライアント プロキシで呼び出 sendMessage されます。 サーバー側コードで 属性を HubName 使用する場合は、使用される名前が、クライアントでハブを作成するために使用される名前と一致することを確認します。 属性を HubName 使用しない場合は、JavaScript クライアント内のハブの名前が、ChatHub ではなく chatHub などのキャメル ケースであることを確認します。

クライアントでのメソッド名の重複

クライアントに、大文字と小文字のみが異なる重複するメソッドがないことを確認します。 クライアント アプリケーションに という名前のメソッドがある場合は、 と sendMessage呼ばれる SendMessage メソッドも存在しないことを確認します。

クライアントに JSON パーサーがない

SignalR では、サーバーとクライアント間の呼び出しをシリアル化するために JSON パーサーが存在する必要があります。 クライアントに組み込みの JSON パーサー (インターネット エクスプローラー 7 など) がない場合は、アプリケーションに含める必要があります。 JSON パーサーは 、こちらからダウンロードできます。

Hub と PersistentConnection の構文の混在

SignalR では、Hubs と PersistentConnections の 2 つの通信モデルが使用されます。 これら 2 つの通信モデルを呼び出すための構文は、クライアント コードで異なります。 サーバー コードにハブを追加した場合は、すべてのクライアント コードで適切なハブ構文が使用されていることを確認します。

JavaScript クライアントで PersistentConnection を作成する JavaScript クライアント コード

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

JavaScript クライアントでハブ プロキシを作成する JavaScript クライアント コード

var myHub = $.connection.MyHub;

ルートを PersistentConnection にマップする C# サーバー コード

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

ルートをハブにマップする C# サーバー コード、または複数のアプリケーションがある場合は複数のハブにマップする

RouteTable.Routes.MapHubs();

サブスクリプションが追加される前に接続が開始されました

サーバーから呼び出すことができるメソッドがプロキシに追加される前にハブの接続が開始された場合、メッセージは受信されません。 次の JavaScript コードは、ハブを正しく起動しません。

Hubs メッセージの受信を許可しない JavaScript クライアント コードが正しくありません

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

代わりに、Start を呼び出す前にメソッド サブスクリプションを追加します。

ハブにサブスクリプションを正しく追加する JavaScript クライアント コード

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

ハブ プロキシにメソッド名がありません

サーバーで定義されているメソッドがクライアントでサブスクライブされていることを確認します。 サーバーは メソッドを定義しますが、クライアント プロキシに追加する必要があります。 メソッドは、次の方法でクライアント プロキシに追加できます (メソッドはハブのメンバーに client 直接追加されることに注意してください)。

ハブ プロキシにメソッドを追加する JavaScript クライアント コード

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

ハブまたはハブのメソッドがパブリックとして宣言されていない

クライアントで表示するには、ハブの実装とメソッドを として public宣言する必要があります。

別のアプリケーションからハブにアクセスする

SignalR Hubs には、SignalR クライアントを実装するアプリケーション経由でのみアクセスできます。 SignalR は、他の通信ライブラリ (SOAP や WCF Web サービスなど) と相互運用できません。ターゲット プラットフォームで使用できる SignalR クライアントがない場合、サーバーのエンドポイントに直接アクセスすることはできません。

データを手動でシリアル化する

SignalR は JSON を自動的に使用してメソッド パラメーターをシリアル化します。自分で行う必要はありません。

OnDisconnected 関数のクライアントでリモート ハブ メソッドが実行されない

この動作は仕様です。 が呼び出されると OnDisconnected 、ハブは既に Disconnected 状態に入っており、それ以上のハブ メソッドを呼び出すことはありません。

OnDisconnected イベントでコードを正しく実行する C# サーバー コード

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

接続の制限に達しました

Windows 7 などのクライアント オペレーティング システムで IIS のフル バージョンを使用すると、10 接続の制限が適用されます。 クライアント OS を使用する場合は、代わりに IIS Express を使用して、この制限を回避します。

クロスドメイン接続が正しく設定されていない

クロスドメイン接続 (SignalR URL がホスティング ページと同じドメインにない接続) が正しく設定されていない場合、エラー メッセージが表示されずに接続が失敗する可能性があります。 クロスドメイン通信を有効にする方法については、「クロスドメイン 接続を確立する方法」を参照してください。

NTLM (Active Directory) を使用した接続が .NET クライアントで動作しない

ドメイン セキュリティを使用する .NET クライアント アプリケーションの接続が正しく構成されていない場合、接続が失敗する可能性があります。 ドメイン環境で SignalR を使用するには、必要な接続プロパティを次のように設定します。

接続資格情報を実装する C# クライアント コード

connection.Credentials = CredentialCache.DefaultCredentials;

接続に関するその他の問題

このセクションでは、接続中に発生する特定の症状またはエラー メッセージの原因と解決策について説明します。

"データを送信する前に開始を呼び出す必要があります" エラー

このエラーは、接続が開始される前にコードが SignalR オブジェクトを参照している場合に一般的に発生します。 サーバーで定義されているメソッドを呼び出すハンドラーなどのワイヤアップは、接続の完了後に追加する必要があります。 への Start 呼び出しは非同期であるため、呼び出しが完了する前に呼び出し後のコードが実行される可能性があることに注意してください。 接続が完全に開始された後にハンドラーを追加する最善の方法は、start メソッドにパラメーターとして渡されるコールバック関数にハンドラーを配置することです。

SignalR オブジェクトを参照するイベント ハンドラーを正しく追加する JavaScript クライアント コード

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

このエラーは、SignalR オブジェクトがまだ参照されている間に接続が停止した場合にも表示されます。

"301 永続的に移動しました" または "302 一時的に移動しました" エラー

このエラーは、自動的に作成されたプロキシに干渉する SignalR というフォルダーがプロジェクトに含まれている場合に表示されることがあります。 このエラーを回避するには、アプリケーションで という名前 SignalR のフォルダーを使用したり、プロキシの自動生成をオフにしたりしないでください。 詳細については、 生成されたプロキシとその機能に関 するページを参照してください。

.NET または Silverlight クライアントでの "403 Forbidden" エラー

このエラーは、クロスドメイン通信が適切に有効になっていないクロスドメイン環境で発生する可能性があります。 クロスドメイン通信を有効にする方法については、「クロスドメイン 接続を確立する方法」を参照してください。 Silverlight クライアントでクロスドメイン接続を確立するには、「Silverlight クライアント からのクロスドメイン接続」を参照してください。

"404 Not Found" エラー

この問題にはいくつかの原因があります。 次のすべてを確認します。

  • ハブ プロキシ アドレス参照が正しく書式設定されていません。 このエラーは、生成されたハブ プロキシ アドレスへの参照が正しく書式設定されていない場合に一般的に発生します。 ハブ アドレスへの参照が正しく作成されていることを確認します。 詳細については、「 動的に生成されたプロキシを参照する方法 」を参照してください。
  • ハブ ルートを追加する前に、アプリケーションにルートを追加します 。アプリケーションで他のルートを使用している場合は、追加された最初のルートが への MapHubs呼び出しであることを確認します。

"500 内部サーバー エラー"

これは、さまざまな原因を持つ可能性がある非常に一般的なエラーです。 エラーの詳細は、サーバーのイベント ログに表示されるか、サーバーのデバッグを通じて確認できます。 サーバーで詳細なエラーを有効にすると、より詳細なエラー情報が得られる場合があります。 詳細については、「 Hub クラスでエラーを処理する方法」を参照してください。

"TypeError: <hubType> is undefined" エラー

このエラーは、 の呼び出しが正しく行われなかった場合に MapHubs 発生します。 詳細については、「 SignalR ルートを登録し、SignalR オプションを構成する方法 」を参照してください。

JsonSerializationException がユーザー コードによって処理されませんでした

メソッドに送信するパラメーターに、シリアル化できない型 (ファイル ハンドルやデータベース接続など) が含まれていないことを確認します。 (セキュリティ上またはシリアル化の理由で) クライアントに送信したくないサーバー側オブジェクトでメンバーを使用する必要がある場合は、 属性を JSONIgnore 使用します。

"プロトコル エラー: 不明なトランスポート" エラー

このエラーは、クライアントが SignalR で使用されるトランスポートをサポートしていない場合に発生する可能性があります。 SignalR で使用できるブラウザーについては、「 トランスポートとフォールバック 」を参照してください。

"JavaScript Hub プロキシの生成が無効になりました。

このエラーは、 が に動的に生成されたプロキシsignalr/hubsへの参照も含めて設定されている場合DisableJavaScriptProxiesに発生します。 プロキシを手動で作成する方法の詳細については、「 生成されたプロキシとその機能」を参照してください。

"接続 ID の形式が正しくありません" または "アクティブな SignalR 接続中にユーザー ID を変更できません" エラー

このエラーは、認証が使用されていて、接続が停止する前にクライアントがログアウトしている場合に表示されることがあります。 解決策は、クライアントをログアウトする前に SignalR 接続を停止することです。

"キャッチされないエラー: SignalR: jQuery が見つかりません。 SignalR.js ファイルの前に jQuery が参照されていることを確認してください" というエラー

SignalR JavaScript クライアントでは、jQuery を実行する必要があります。 jQuery への参照が正しいこと、使用されるパスが有効であることを確認し、jQuery への参照が SignalR への参照の前にあることを確認します。

"Uncaught TypeError: undefined のプロパティ '<property>' を読み取ることができません" エラー

このエラーは、jQuery またはハブ プロキシが正しく参照されていないことが発生します。 jQuery とハブ プロキシへの参照が正しいこと、使用されているパスが有効であることを確認し、jQuery への参照がハブ プロキシへの参照の前にあることを確認します。 ハブ プロキシへの既定の参照は次のようになります。

ハブ プロキシを正しく参照する HTML クライアント側コード

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

"RuntimeBinderException がユーザー コードによって処理されませんでした" エラー

このエラーは、 の正しくないオーバーロード Hub.On が使用されている場合に発生する可能性があります。 メソッドに戻り値がある場合は、戻り値の型をジェネリック型パラメーターとして指定する必要があります。

クライアントで定義されたメソッド (生成されたプロキシなし)

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

接続 ID が一貫性がない、またはページ読み込みの間に接続が切断される

この動作は仕様です。 ハブ オブジェクトはページ オブジェクトでホストされるため、ページが更新されるとハブは破棄されます。 マルチページ アプリケーションでは、ユーザーと接続 ID の間の関連付けを維持して、ページ読み込みの間で一貫性を保つ必要があります。 接続 ID は、オブジェクトまたはデータベースの ConcurrentDictionary サーバーに格納できます。

"値を null にすることはできません" エラー

省略可能なパラメーターを持つサーバー側メソッドは現在サポートされていません。省略可能なパラメーターを省略すると、 メソッドは失敗します。 詳細については、「省略可能なパラメーター」をご覧ください。

Firebug で "Firefox はアドレス>で<サーバーへの接続を確立できません" というエラーが表示される

このエラー メッセージは、WebSocket トランスポートのネゴシエーションが失敗し、代わりに別のトランスポートが使用されている場合に Firebug で確認できます。 この動作は仕様です。

.NET クライアント アプリケーションの "検証手順に従ってリモート証明書が無効です" というエラーが表示される

サーバーでカスタム クライアント証明書が必要な場合は、要求が行われる前に x509certificate を接続に追加できます。 を使用して、接続に証明書を Connection.AddClientCertificate追加します。

認証がタイムアウトした後に接続が切断される

この動作は仕様です。 接続がアクティブな間は、認証資格情報を変更できません。資格情報を更新するには、接続を停止して再起動する必要があります。

jQuery Mobile を使用すると OnConnected が 2 回呼び出される

jQuery Mobile の initializePage 関数では、各ページのスクリプトが強制的に再実行されるため、2 つ目の接続が作成されます。 この問題の解決策は次のとおりです。

  • JavaScript ファイルの前に jQuery Mobile への参照を含めます。
  • を設定$.mobile.autoInitializePage = falseして関数をinitializePage無効にします。
  • ページの初期化が完了するまで待ってから、接続を開始します。

サーバー送信イベントを使用して Silverlight アプリケーションでメッセージが遅延する

Silverlight でサーバー送信イベントを使用すると、メッセージが遅延します。 代わりに長いポーリングを強制的に使用するには、接続を開始するときに次のコマンドを使用します。

connection.Start(new LongPollingTransport());

Forever Frame プロトコルを使用して "アクセス許可が拒否されました"

これは既知の問題 です。ここで説明します。 この現象は、最新の JQuery ライブラリを使用して確認できます。回避策は、アプリケーションを JQuery 1.8.2 にダウングレードすることです。

コンパイルエラーとサーバー側エラー

次のセクションでは、コンパイラとサーバー側のランタイム エラーに対して考えられる解決策について説明します。

ハブ インスタンスへの参照が null です

ハブ インスタンスは接続ごとに作成されるため、自分でコードにハブのインスタンスを作成することはできません。 ハブ自体の外部からハブのメソッドを呼び出すには、ハブ コンテキストへの参照を取得する方法については、 ハブ クラスの外部からクライアント メソッドを呼び出し、グループを管理 する方法に関するページを参照してください。

HTTPContext.Current.Session が null です

この動作は仕様です。 SignalR では、セッション状態を有効にすると双方向メッセージングが中断されるため、ASP.NET セッション状態はサポートされません。

オーバーライドする適切なメソッドがありません

古いドキュメントまたはブログのコードを使用している場合は、このエラーが表示されることがあります。 変更または非推奨になったメソッドの名前 (など OnConnectedAsync) を参照しないことを確認します。

HostContextExtensions.WebSocketServerUrl が null です

この動作は仕様です。 このメンバーは非推奨であり、使用しないでください。

"'signalr.hubs' という名前のルートがルート コレクションに既に存在します" というエラー

このエラーは、 がアプリケーションによって 2 回呼び出された場合 MapHubs に表示されます。 一部のサンプル アプリケーションでは、グローバル アプリケーション ファイルで直接呼び出 MapHubs し、ラッパー クラスで呼び出しを行うアプリケーションもあります。 アプリケーションで両方が実行されていないことを確認します。

Visual Studio の問題

このセクションでは、Visual Studio で発生する問題について説明します。

[ドキュメントのスクリプト] ノードがソリューション エクスプローラーに表示されない

一部のチュートリアルでは、デバッグ中にソリューション エクスプローラーの [スクリプト ドキュメント] ノードにアクセスできます。 このノードは JavaScript デバッガーによって生成され、インターネット エクスプローラーでのブラウザー クライアントのデバッグ中にのみ表示されます。Chrome または Firefox が使用されている場合、ノードは表示されません。 Silverlight デバッガーなど、別のクライアント デバッガーが実行されている場合、JavaScript デバッガーも実行されません。

SignalR は Visual Studio 2008 以前では機能しません

この動作は仕様です。 SignalR には.NET Framework 4 以降が必要です。そのためには、Visual Studio 2010 以降で SignalR アプリケーションを開発する必要があります。

IIS の問題

このセクションでは、インターネット インフォメーション サービスに関する問題について説明します。

MapHubs 呼び出し後に Web サイトがクラッシュする

この問題は、SignalR の最新バージョンで修正されています。 NuGet を使用してインストールを更新して、SignalR の最新リリース バージョンを使用していることを確認します。

Azure の問題

このセクションには、Microsoft Azure に関する問題が含まれています。

トピック名を変更した後、Azure バックプレーンを介してメッセージが受信されない

Azure バックプレーンで使用されるトピックは、ユーザーが構成可能であることを意図したものではありません。