次の方法で共有


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

作成者: Patrick Fletcher

警告

このドキュメントは、最新版の SignalR を対象としていません。 ASP.NET Core SignalR に関する記事を参照してください。

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

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

クライアントとサーバーの間のメソッドの呼び出しが警告なく失敗する

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

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

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

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

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

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

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

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

ハブと PersistentConnection の構文の混在

SignalR は、ハブと PersistentConnection の 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 コードは、ハブを正しく起動しません。

ハブ メッセージの受信を許可しない正しくない 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 ハブには、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;

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

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

"Start must be called before data can be sent\(データを送信する前に Start を呼び出す必要があります\)" のエラー

このエラーは、接続が開始される前にコードが SignalR オブジェクトを参照する場合に一般的に発生します。 サーバーで定義されているメソッドを呼び出すハンドラーなどの構成は、接続が完了した後に追加する必要があります。 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 Moved Permanently" または "302 Moved Temporarily" エラー

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

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

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

"404 Not Found" エラー

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

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

"500 Internal Server" エラー

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

"TypeError: <hubType> が未定義です" エラー

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

JsonSerializationException がユーザー コードによって処理されなかった

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

"Protocol error: Unknown transport \(プロトコル エラー: 不明なトランスポート\)" エラー

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

"JavaScript Hub proxy generation has been disabled. \(JavaScript Hub プロキシの生成が無効になりました。\)"

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

"The connection ID is in the incorrect format \(接続 ID が正しくない形式です\)" または "アクティブな SignalR 接続中にユーザー ID を変更できません \(The user identity cannot change during an active SignalR connection\)" エラー

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

"Uncaught Error: SignalR: jQuery not found. \(キャッチされないエラー: SignalR: jQuery が見つかりません。\) Please ensure jQuery is referenced before the SignalR.js file \(SignalR.js ファイルの前に jQuery が参照されていることを確認してください\)" エラー

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

"Uncaught TypeError: Cannot read property '<property>' of undefined \(キャッチされない TypeError: 未定義のプロパティ '' を読み取ることができません\)" エラー

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

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

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

"RuntimeBinderException was unhandled by user code \(RuntimeBinderException がユーザー コードによって処理されませんでした\)" エラー

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

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

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

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

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

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

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

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

このエラー メッセージは、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' という名前のルートは既にルート コレクションにあります" エラー

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

Visual Studio の問題

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

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

一部のチュートリアルでは、デバッグ中にソリューション エクスプローラーの [スクリプト ドキュメント] ノードに誘導されます。 このノードは JavaScript デバッガーによって生成され、Internet Explorer のブラウザー クライアントのデバッグ中にのみ表示されます。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 バックプレーンで使用されるトピックは、ユーザーが構成できるようには意図されていません。