ASP.NET SignalR ハブ API ガイド - サーバー (SignalR 1.x)ASP.NET SignalR Hubs API Guide - Server (SignalR 1.x)

によってPatrick FletcherTom Dykstraby Patrick Fletcher, Tom Dykstra

Note

この記事では、ASP.NET SignalR を指します。This article refers to ASP.NET SignalR. SignalR を使用して、Java、Node.js、またはサーバーレス シナリオでは、リアルタイムのシナリオを有効にする方法と思う場合を見てASP.NET Core SignalRします。If you're thinking about using SignalR to enable real-time scenarios with Java, Node.js, or in a serverless scenario, take a look at ASP.NET Core SignalR. 既に ASP.NET SignalR を使用した場合を見て、のバージョンの違いバージョンの違いと ASP.NET Core SignalR での機能強化を理解するページ。If you've already used ASP.NET SignalR, take a look at the version differences page to understand the differences in the versions and the improvements in ASP.NET Core SignalR. 最後に、Microsoft Azure でリアルタイム アプリを実行することがわかっている場合を見て、 Azure SignalR サービスなど、アプリを必要とすると、クラウド ベースのスケール アウトを提供します。Finally, if you know you'll be running your real-time apps in Microsoft Azure, take a look at the Azure SignalR Service, as it provides cloud-based scale-out once your apps need it.

このドキュメントでは、一般的なオプションを示すコード サンプルを使用したバージョン 1.1 では、SignalR のサーバー側の ASP.NET SignalR ハブの API をプログラミングの概要を示します。This document provides an introduction to programming the server side of the ASP.NET SignalR Hubs API for SignalR version 1.1, with code samples demonstrating common options.

SignalR ハブの API では、サーバーからに接続されているクライアントとサーバーのクライアントからのリモート プロシージャ コール (Rpc) を作成することができます。The SignalR Hubs API enables you to make remote procedure calls (RPCs) from a server to connected clients and from clients to the server. サーバー コードで、クライアントから呼び出すことができるメソッドを定義して、クライアント上で実行されるメソッドを呼び出します。In server code, you define methods that can be called by clients, and you call methods that run on the client. クライアント コードで、サーバーから呼び出すことができるメソッドを定義して、サーバー上で実行されるメソッドを呼び出します。In client code, you define methods that can be called from the server, and you call methods that run on the server. SignalR は、のすべてのクライアントとサーバーが処理されます。SignalR takes care of all of the client-to-server plumbing for you.

SignalR では、永続的な接続と呼ばれる下位レベル API も提供します。SignalR also offers a lower-level API called Persistent Connections. 概要については、SignalR、ハブ、および永続的な接続は、または完全な SignalR アプリケーションを構築する方法を示すチュートリアルについてを参照してください。 SignalR - Getting Startedします。For an introduction to SignalR, Hubs, and Persistent Connections, or for a tutorial that shows how to build a complete SignalR application, see SignalR - Getting Started.

概要Overview

このドキュメントは、次のトピックに分かれています。This document contains the following sections:

クライアントのプログラム方法については、次のリソースを参照してください。For documentation on how to program clients, see the following resources:

.NET 4.5 バージョンの API は API のリファレンス トピックへのリンクです。Links to API Reference topics are to the .NET 4.5 version of the API. .NET 4 を使用している場合は、次を参照してください。 .NET 4 のバージョンを API のトピックのします。If you're using .NET 4, see the .NET 4 version of the API topics.

SignalR のルートを登録し、SignalR のオプションを構成する方法How to register the SignalR route and configure SignalR options

クライアントがハブへの接続に使用するルートを定義するには、呼び出し、 MapHubsメソッド、アプリケーションの起動時にします。To define the route that clients will use to connect to your Hub, call the MapHubs method when the application starts. MapHubs 拡張メソッドSystem.Web.Routing.RouteCollectionクラス。MapHubs is an extension method for the System.Web.Routing.RouteCollection class. 次の例は、SignalR ハブ ルートを定義する方法を示します、 Global.asaxファイル。The following example shows how to define the SignalR Hubs route in the Global.asax file.

using System.Web.Routing;
public class Global : System.Web.HttpApplication
{
    protected void Application_Start(object sender, EventArgs e)
    {
        RouteTable.Routes.MapHubs();
    }
}

ASP.NET MVC アプリケーションに SignalR の機能を追加する場合は、SignalR のルートが、他のルートの前に追加されたことを確認します。If you are adding SignalR functionality to an ASP.NET MVC application, make sure that the SignalR route is added before the other routes. 詳しくは、「チュートリアル: SignalR と MVC 4 の概要します。For more information, see Tutorial: Getting Started with SignalR and MVC 4.

/Signalr URLThe /signalr URL

既定では、クライアントがハブへの接続に使用するルートの URL は"/signalr"。By default, the route URL which clients will use to connect to your Hub is "/signalr". (この URL は自動的に生成された JavaScript ファイルの「/signalr ハブ」の url を混同しないでください。(Don't confuse this URL with the "/signalr/hubs" URL, which is for the automatically generated JavaScript file. 生成されたプロキシの詳細については、次を参照してくださいSignalR ハブ API ガイド - JavaScript クライアントで生成されたプロキシとは何が。)。For more information about the generated proxy, see SignalR Hubs API Guide - JavaScript Client - The generated proxy and what it does for you.)

SignalR; に対しては使用できませんのベース URL を構成した特殊な状況である可能性があります。たとえば、という名前のプロジェクトのフォルダーがあるsignalr名前を変更するとします。There might be extraordinary circumstances that make this base URL not usable for SignalR; for example, you have a folder in your project named signalr and you don't want to change the name. 次の例に示すように、ベースの URL を変更する場合、(置換"/signalr"で、目的の URL を使用してサンプル コード)。In that case, you can change the base URL, as shown in the following examples (replace "/signalr" in the sample code with your desired URL).

サーバー コード、URL を指定します。Server code that specifies the URL

RouteTable.Routes.MapHubs("/signalr", new HubConfiguration());

JavaScript クライアント コード (生成されたプロキシ) を使用して URL を指定します。JavaScript client code that specifies the URL (with the generated proxy)

$.connection.hub.url = "/signalr"
$.connection.hub.start().done(init);

JavaScript クライアント コード (せずに、生成されたプロキシ) URL を指定します。JavaScript client code that specifies the URL (without the generated proxy)

var connection = $.hubConnection("/signalr", { useDefaultPath: false });

.NET クライアント コード、URL を指定します。.NET client code that specifies the URL

var hubConnection = new HubConnection("http://contoso.com/signalr", useDefaultUrl: false);

SignalR のオプションを構成します。Configuring SignalR Options

オーバー ロード、MapHubsメソッドを使用すると、カスタムの URL、カスタム依存関係競合回避モジュール、および、次のオプションを指定します。Overloads of the MapHubs method enable you to specify a custom URL, a custom dependency resolver, and the following options:

  • ブラウザー クライアントからのクロス ドメイン呼び出しを有効にします。Enable cross-domain calls from browser clients.

    通常、ブラウザーがからページを読み込む場合http://contoso.com、SignalR 接続が同じドメイン内ではhttp://contoso.com/signalrします。Typically if the browser loads a page from http://contoso.com, the SignalR connection is in the same domain, at http://contoso.com/signalr. 場合、ページからhttp://contoso.comへの接続は、http://fabrikam.com/signalrドメイン間の接続されています。If the page from http://contoso.com makes a connection to http://fabrikam.com/signalr, that is a cross-domain connection. セキュリティ上の理由から、ドメイン間の接続が既定で無効になります。For security reasons, cross-domain connections are disabled by default. 詳細については、次を参照してください。 ASP.NET SignalR ハブ API ガイド - JavaScript クライアントのドメイン間の接続を確立する方法します。For more information, see ASP.NET SignalR Hubs API Guide - JavaScript Client - How to establish a cross-domain connection.

  • 詳細なエラー メッセージを有効にします。Enable detailed error messages.

    エラーが発生すると、SignalR の既定の動作が発生した事象に関する詳細なしの通知メッセージをクライアントに送信するは。When errors occur, the default behavior of SignalR is to send to clients a notification message without details about what happened. 詳細なエラー情報をクライアントに送信することは推奨されません、運用環境で悪意のあるユーザーは、アプリケーションに対する攻撃の情報を使用できない可能性があるため。Sending detailed error information to clients is not recommended in production, because malicious users might be able to use the information in attacks against your application. トラブルシューティングについては、一時的に詳しいエラー報告を有効にするのにこのオプションを使用できます。For troubleshooting, you can use this option to temporarily enable more informative error reporting.

  • 自動的に生成された JavaScript プロキシ ファイルを無効にします。Disable automatically generated JavaScript proxy files.

    既定では、URL「/signalr ハブ」への応答で、ハブ クラスのプロキシを持つ JavaScript ファイルが生成されます。By default, a JavaScript file with proxies for your Hub classes is generated in response to the URL "/signalr/hubs". JavaScript プロキシを使用する場合、または手動でこのファイルを生成し、クライアントの物理ファイルを参照する場合は、プロキシの生成を無効にするのにこのオプションを使用できます。If you don't want to use the JavaScript proxies, or if you want to generate this file manually and refer to a physical file in your clients, you can use this option to disable proxy generation. 詳細については、次を参照してください。 SignalR ハブ API ガイド - JavaScript クライアント - SignalR の物理ファイルを作成する方法は、プロキシを生成します。For more information, see SignalR Hubs API Guide - JavaScript Client - How to create a physical file for the SignalR generated proxy.

次の例への呼び出しで SignalR 接続の URL とこれらのオプションを指定する方法を示しています、MapHubsメソッド。The following example shows how to specify the SignalR connection URL and these options in a call to the MapHubs method. カスタム URL を指定するには、置き換える"/signalr"を使用する URL の例です。To specify a custom URL, replace "/signalr" in the example with the URL that you want to use.

var hubConfiguration = new HubConfiguration();
hubConfiguration.EnableCrossDomain = true;
hubConfiguration.EnableDetailedErrors = true;
hubConfiguration.EnableJavaScriptProxies = false;
RouteTable.Routes.MapHubs("/signalr", hubConfiguration);

作成し、ハブ クラスを使用する方法How to create and use Hub classes

ハブを作成するから派生したクラスを作成Microsoft.Aspnet.Signalr.Hubします。To create a Hub, create a class that derives from Microsoft.Aspnet.Signalr.Hub. 次の例では、チャット アプリケーションの単純なハブ クラスを示します。The following example shows a simple Hub class for a chat application.

public class ContosoChatHub : Hub
{
    public void NewContosoChatMessage(string name, string message)
    {
        Clients.All.addNewMessageToPage(name, message);
    }
}

この例では、接続されているクライアントが呼び出すことができます、NewContosoChatMessageメソッドでは、接続されているすべてのクライアントに受信したデータをブロードキャストするときと。In this example, a connected client can call the NewContosoChatMessage method, and when it does, the data received is broadcasted to all connected clients.

ハブ オブジェクトの有効期間Hub object lifetime

ハブ クラスをインスタンス化したり、サーバー上のコードからメソッドを呼び出すしません。これらすべてはの SignalR ハブ パイプラインによって行われます。You don't instantiate the Hub class or call its methods from your own code on the server; all that is done for you by the SignalR Hubs pipeline. SignalR は、ときに、クライアントが接続切断されると、またはサーバー メソッドの呼び出しを行ったなど、ハブの操作を処理する必要があるたびに、ハブ クラスの新しいインスタンスを作成します。SignalR creates a new instance of your Hub class each time it needs to handle a Hub operation such as when a client connects, disconnects, or makes a method call to the server.

ハブ クラスのインスタンスは、一時的なであるため、次の 1 つのメソッド呼び出しからの状態を維持するために使用できません。Because instances of the Hub class are transient, you can't use them to maintain state from one method call to the next. たびに、サーバー メッセージを受信メソッド呼び出しをクライアントでは、ハブ クラスのプロセスの新しいインスタンス。Each time the server receives a method call from a client, a new instance of your Hub class processes the message. を介して複数の接続とメソッドの呼び出しの状態を維持するために、ハブ クラスまたは別のクラスから派生していないデータベース、または静的変数などの他のメソッドを使用して、Hubします。To maintain state through multiple connections and method calls, use some other method such as a database, or a static variable on the Hub class, or a different class that does not derive from Hub. メモリ内のデータを永続化する場合、ハブ クラスに静的変数などのメソッドを使用して、データは失われますアプリ ドメインがリサイクルされる場合。If you persist data in memory, using a method such as a static variable on the Hub class, the data will be lost when the app domain recycles.

ハブ クラス外部で実行されるコードからクライアントにメッセージを送信する場合、ハブ クラスのインスタンスをインスタンス化して行うことはできませんが、ハブ クラスの SignalR コンテキスト オブジェクトへの参照を取得することによって行うことができます。If you want to send messages to clients from your own code that runs outside the Hub class, you can't do it by instantiating a Hub class instance, but you can do it by getting a reference to the SignalR context object for your Hub class. 詳細については、次を参照してください。クライアント メソッドを呼び出すと、ハブ クラスの外部からグループを管理する方法このトピックで後述します。For more information, see How to call client methods and manage groups from outside the Hub class later in this topic.

JavaScript クライアントではハブの名前のキャメルCamel-casing of Hub names in JavaScript clients

既定では、JavaScript クライアントがハブにクラス名の camel 形式のバージョンを使用して参照します。By default, JavaScript clients refer to Hubs by using a camel-cased version of the class name. SignalR では、JavaScript コードは、JavaScript の規則に従うことができるように、この変更が自動的に作成します。SignalR automatically makes this change so that JavaScript code can conform to JavaScript conventions. 前の例と呼ばれるcontosoChatHubJavaScript コードにします。The previous example would be referred to as contosoChatHub in JavaScript code.

サーバーServer

public class ContosoChatHub : Hub

生成されたプロキシを使用して JavaScript クライアントJavaScript client using generated proxy

var contosoChatHubProxy = $.connection.contosoChatHub;

クライアントを使用して、追加するための別の名前を指定するかどうか、HubName属性。If you want to specify a different name for clients to use, add the HubName attribute. 使用すると、HubName属性は、JavaScript クライアントにキャメル ケースに名前の変更はありません。When you use a HubName attribute, there is no name change to camel case on JavaScript clients.

サーバーServer

[HubName("PascalCaseContosoChatHub")]
public class ContosoChatHub : Hub

生成されたプロキシを使用して JavaScript クライアントJavaScript client using generated proxy

var contosoChatHubProxy = $.connection.PascalCaseContosoChatHub;

複数のハブMultiple Hubs

アプリケーションでは、複数のハブ クラスを定義できます。You can define multiple Hub classes in an application. そうと、接続は共有されますが、グループは別。When you do that, the connection is shared but groups are separate:

  • すべてのクライアントは、サービスと SignalR の接続を確立するために、同じ URL を使用 ("/signalr"またはいずれかを指定した場合、カスタムの URL)、すべてのハブの接続を使用して、サービスで定義されています。All clients will use the same URL to establish a SignalR connection with your service ("/signalr" or your custom URL if you specified one), and that connection is used for all Hubs defined by the service.

    比較する 1 つのクラスでハブのすべての機能を定義すると、複数のハブのパフォーマンスの違いはありません。There is no performance difference for multiple Hubs compared to defining all Hub functionality in a single class.

  • すべてのハブでは、同じ HTTP 要求情報を取得します。All Hubs get the same HTTP request information.

    すべてのハブが同じ接続を共有するため、サーバーを取得する HTTP 要求情報は、SignalR の接続を確立する元の HTTP 要求で何が。Since all Hubs share the same connection, the only HTTP request information that the server gets is what comes in the original HTTP request that establishes the SignalR connection. クエリ文字列を指定することで、クライアントからサーバーに情報を渡すために、接続要求を使用する場合は、別のハブに別のクエリ文字列を提供できません。If you use the connection request to pass information from the client to the server by specifying a query string, you can't provide different query strings to different Hubs. すべてのハブと同じ情報が表示されます。All Hubs will receive the same information.

  • JavaScript プロキシの生成されたファイルは、1 つのファイルですべてのハブ プロキシが含まれます。The generated JavaScript proxies file will contain proxies for all Hubs in one file.

    JavaScript プロキシの詳細については、次を参照してください。 SignalR ハブ API ガイド - JavaScript クライアントで生成されたプロキシとは何がします。For information about JavaScript proxies, see SignalR Hubs API Guide - JavaScript Client - The generated proxy and what it does for you.

  • グループは、ハブ内で定義されます。Groups are defined within Hubs.

    SignalR を定義することで接続されているクライアントのサブセットにブロードキャストするグループの名前。In SignalR you can define named groups to broadcast to subsets of connected clients. グループは、各ハブとは別に保持されます。Groups are maintained separately for each Hub. たとえば、"Administrators"という名前のグループはクライアントの 1 つのセットを追加、ContosoChatHubクラスと同じグループ名は参照されている場合にクライアントを別のセットに、StockTickerHubクラス。For example, a group named "Administrators" would include one set of clients for your ContosoChatHub class, and the same group name would refer to a different set of clients for your StockTickerHub class.

クライアントが呼び出すことができる、ハブ クラスにメソッドを定義する方法How to define methods in the Hub class that clients can call

クライアントから呼び出せるようにするハブのメソッドを公開するには、次の例に示すように、パブリック メソッドを宣言します。To expose a method on the Hub that you want to be callable from the client, declare a public method, as shown in the following examples.

public class ContosoChatHub : Hub
{
    public void NewContosoChatMessage(string name, string message)
    {
        Clients.All.addNewMessageToPage(name, message);
    }
}
public class StockTickerHub : Hub
{
    public IEnumerable<Stock> GetAllStocks()
    {
        return _stockTicker.GetAllStocks();
    }
}

戻り値の型と複合型と配列を含む c# メソッドの場合と、パラメーターを指定できます。You can specify a return type and parameters, including complex types and arrays, as you would in any C# method. パラメーターが表示されるか、呼び出し元に返すデータは、JSON を使用して、クライアントとサーバー間通信し、SignalR は複雑なオブジェクトのバインドとオブジェクトの配列を自動的に処理します。Any data that you receive in parameters or return to the caller is communicated between the client and the server by using JSON, and SignalR handles the binding of complex objects and arrays of objects automatically.

JavaScript クライアント内のメソッド名の大文字小文字のキャメル形式Camel-casing of method names in JavaScript clients

既定では、メソッド名の camel 形式のバージョンを使用して JavaScript クライアントがハブ メソッドを参照します。By default, JavaScript clients refer to Hub methods by using a camel-cased version of the method name. SignalR では、JavaScript コードは、JavaScript の規則に従うことができるように、この変更が自動的に作成します。SignalR automatically makes this change so that JavaScript code can conform to JavaScript conventions.

サーバーServer

public void NewContosoChatMessage(string userName, string message)

生成されたプロキシを使用して JavaScript クライアントJavaScript client using generated proxy

contosoChatHubProxy.server.newContosoChatMessage($(userName, message);

クライアントを使用して、追加するための別の名前を指定するかどうか、HubMethodName属性。If you want to specify a different name for clients to use, add the HubMethodName attribute.

サーバーServer

[HubMethodName("PascalCaseNewContosoChatMessage")]
public void NewContosoChatMessage(string userName, string message)

生成されたプロキシを使用して JavaScript クライアントJavaScript client using generated proxy

contosoChatHubProxy.server.PascalCaseNewContosoChatMessage(userName, message);

非同期的に実行するタイミングWhen to execute asynchronously

データベース検索など、web サービス呼び出しの待機を含むのハブ メソッドを返すことによって非同期にする場合がある実行時間の長いメソッドまたは作業を実行する必要がありますは、タスク(の代わりにvoidを返す) またはタスク<T> オブジェクト (の代わりにT型を返す)。If the method will be long-running or has to do work that would involve waiting, such as a database lookup or a web service call, make the Hub method asynchronous by returning a Task (in place of void return) or Task<T> object (in place of T return type). 戻ると、Taskオブジェクト、メソッドでは、SignalR を待ちます、Taskを完了するし、そのラップ解除された結果、クライアントに戻るため、クライアントでメソッドの呼び出しをコーディングする方法に違いはありません。When you return a Task object from the method, SignalR waits for the Task to complete, and then it sends the unwrapped result back to the client, so there is no difference in how you code the method call in the client.

ハブ メソッドを行う非同期回避 WebSocket トランスポートを使用する場合は、接続をブロックしています。Making a Hub method asynchronous avoids blocking the connection when it uses the WebSocket transport. ハブ メソッドを同期的に実行すると、トランスポートが WebSocket のハブ メソッドが完了するまでに、同じクライアントからハブのメソッドの後続の呼び出しがブロックされます。When a Hub method executes synchronously and the transport is WebSocket, subsequent invocations of methods on the Hub from the same client are blocked until the Hub method completes.

次の例と同じメソッドが同期的に実行するコード化されたまたはいずれかのバージョンを呼び出すために動作する JavaScript クライアント コードの後に、非同期的を示します。The following example shows the same method coded to run synchronously or asynchronously, followed by JavaScript client code that works for calling either version.

同期Synchronous

public IEnumerable<Stock> GetAllStocks()
{
    // Returns data from memory.
    return _stockTicker.GetAllStocks();
}

非同期の ASP.NET 4.5Asynchronous - ASP.NET 4.5

public async Task<IEnumerable<Stock>> GetAllStocks()
{
    // Returns data from a web service.
    var uri = Util.getServiceUri("Stocks");
    using (HttpClient httpClient = new HttpClient())
    {
        var response = await httpClient.GetAsync(uri);
        return (await response.Content.ReadAsAsync<IEnumerable<Stock>>());
    }
}

生成されたプロキシを使用して JavaScript クライアントJavaScript client using generated proxy

stockTickerHubProxy.server.getAllStocks().done(function (stocks) {
    $.each(stocks, function () {
        alert(this.Symbol + ' ' + this.Price);
    });
});

ASP.NET 4.5 で非同期メソッドを使用する方法の詳細については、次を参照してください。 ASP.NET MVC 4 での非同期のメソッドを使用してします。For more information about how to use asynchronous methods in ASP.NET 4.5, see Using Asynchronous Methods in ASP.NET MVC 4.

オーバー ロードを定義します。Defining Overloads

メソッドのオーバー ロードを定義する場合は、各オーバー ロードのパラメーターの数が異なる場合があります。If you want to define overloads for a method, the number of parameters in each overload must be different. さまざまなパラメーターの型を指定するだけでオーバー ロードを区別する場合は、ハブ クラスはコンパイルされますが、SignalR サービスはオーバー ロードのいずれかの呼び出しにクライアントがしようとするいると、実行時に例外をスローします。If you differentiate an overload just by specifying different parameter types, your Hub class will compile but the SignalR service will throw an exception at run time when clients try to call one of the overloads.

Hub クラスからのクライアント メソッドを呼び出す方法How to call client methods from the Hub class

サーバーからクライアント メソッドを呼び出すには、使用、Clientsハブ クラス内のメソッドのプロパティ。To call client methods from the server, use the Clients property in a method in your Hub class. 次の例では、サーバー コードを呼び出すaddNewMessageToPage接続されているすべてのクライアント、および JavaScript クライアント内でメソッドを定義するクライアント コードにします。The following example shows server code that calls addNewMessageToPage on all connected clients, and client code that defines the method in a JavaScript client.

サーバーServer

public class ContosoChatHub : Hub
{
    public void NewContosoChatMessage(string name, string message)
    {
        Clients.All.addNewMessageToPage(name, message);
    }
}

生成されたプロキシを使用して JavaScript クライアントJavaScript client using generated proxy

contosoChatHubProxy.client.addNewMessageToPage = function (name, message) {
    // Add the message to the page. 
    $('#discussion').append('<li><strong>' + htmlEncode(name)
        + '</strong>: ' + htmlEncode(message) + '<li>');
};

クライアントのメソッドから戻り値を取得できません。などの構文int x = Clients.All.add(1,1)は機能しません。You can't get a return value from a client method; syntax such as int x = Clients.All.add(1,1) does not work.

複合型とパラメーターの配列を指定することができます。You can specify complex types and arrays for the parameters. 次の例では、複合型をメソッドのパラメーターに、クライアントに渡します。The following example passes a complex type to the client in a method parameter.

サーバー コードを複雑なオブジェクトを使用してクライアント メソッドを呼び出すServer code that calls a client method using a complex object

public void SendMessage(string name, string message)
{
    Clients.All.addContosoChatMessageToPage(new ContosoChatMessage() { UserName = name, Message = message });
}

複雑なオブジェクトを定義するサーバー コードServer code that defines the complex object

public class ContosoChatMessage
{
    public string UserName { get; set; }
    public string Message { get; set; }
}

生成されたプロキシを使用して JavaScript クライアントJavaScript client using generated proxy

var contosoChatHubProxy = $.connection.contosoChatHub;
contosoChatHubProxy.client.addMessageToPage = function (message) {
    console.log(message.UserName + ' ' + message.Message);
});

クライアントを選択すると、RPC が表示されます。Selecting which clients will receive the RPC

クライアントのプロパティを返します、 HubConnectionContext RPC 受信するクライアントを指定するためのいくつかのオプションを提供するオブジェクト。The Clients property returns a HubConnectionContext object that provides several options for specifying which clients will receive the RPC:

  • 接続されているすべてのクライアント。All connected clients.

    Clients.All.addContosoChatMessageToPage(name, message);
    
  • 呼び出し元のクライアントのみです。Only the calling client.

    Clients.Caller.addContosoChatMessageToPage(name, message);
    
  • 呼び出し元のクライアントを除くすべてのクライアント。All clients except the calling client.

    Clients.Others.addContosoChatMessageToPage(name, message);
    
  • 接続 ID で識別される特定のクライアントA specific client identified by connection ID.

    Clients.Client(Context.ConnectionId).addContosoChatMessageToPage(name, message);
    

    この例ではaddContosoChatMessageToPage呼び出し元のクライアントで使用すると同じ効果がありClients.Callerします。This example calls addContosoChatMessageToPage on the calling client and has the same effect as using Clients.Caller.

  • 接続されているすべてのクライアント接続 ID で識別される、指定されたクライアントを除くAll connected clients except the specified clients, identified by connection ID.

    Clients.AllExcept(connectionId1, connectionId2).addContosoChatMessageToPage(name, message);
    
  • すべてには、指定したグループ内のクライアントが接続されています。All connected clients in a specified group.

    Clients.Group(groupName).addContosoChatMessageToPage(name, message);
    
  • 接続 ID で識別される、指定されたクライアントを除く、指定したグループに接続されているすべてのクライアントAll connected clients in a specified group except the specified clients, identified by connection ID.

    Clients.Group(groupName, connectionId1, connectionId2).addContosoChatMessageToPage(name, message);
    
  • 指定したグループ内のすべての接続されているクライアントは、呼び出し元のクライアントを除きます。All connected clients in a specified group except the calling client.

    Clients.OthersInGroup(groupName).addContosoChatMessageToPage(name, message);
    

メソッド名のコンパイル時検証なしNo compile-time validation for method names

指定したメソッド名は、IntelliSense またはコンパイル時検証がないことを意味の動的オブジェクトとして解釈されます。The method name that you specify is interpreted as a dynamic object, which means there is no IntelliSense or compile-time validation for it. 式は、実行時に評価されます。The expression is evaluated at run time. メソッドの呼び出しを実行するときにそのメソッドが呼び出される SignalR メソッド名とパラメーターの値をクライアントに送信し、名前に一致する場合は、クライアントがある、メソッド、およびパラメーターの値は渡されます。When the method call executes, SignalR sends the method name and the parameter values to the client, and if the client has a method that matches the name, that method is called and the parameter values are passed to it. クライアントに一致するメソッドが見つからない場合、エラーは発生しません。If no matching method is found on the client, no error is raised. SignalR は、クライアント メソッドを呼び出すと、バック グラウンドでクライアントに送信するデータの形式の詳細については、次を参照してください。 SignalR 入門します。For information about the format of the data that SignalR transmits to the client behind the scenes when you call a client method, see Introduction to SignalR.

大文字のメソッド名に一致します。Case-insensitive method name matching

大文字と小文字が一致するメソッドの名前です。Method name matching is case-insensitive. たとえば、Clients.All.addContosoChatMessageToPageサーバーで実行AddContosoChatMessageToPageaddcontosochatmessagetopage、またはaddContosoChatMessageToPageクライアント。For example, Clients.All.addContosoChatMessageToPage on the server will execute AddContosoChatMessageToPage, addcontosochatmessagetopage, or addContosoChatMessageToPage on the client.

非同期実行Asynchronous execution

メソッドを呼び出すことは非同期的に実行します。The method that you call executes asynchronously. SignalR の後続行のコードをすることを指定しない限り、クライアントにデータの送信を完了するを待たず、クライアントへのメソッド呼び出しはすぐに実行後に付属している任意のコードでは、メソッドの完了を待つ必要があります。Any code that comes after a method call to a client will execute immediately without waiting for SignalR to finish transmitting data to clients unless you specify that the subsequent lines of code should wait for method completion. クライアントの 2 つの方法を順番に実行する方法を表示する次のコード例を使用して .NET 4.5 で動作するコードを使用して .NET 4 で動作するコードです。The following code examples show how to execute two client methods sequentially, one using code that works in .NET 4.5, and one using code that works in .NET 4.

.NET 4.5 の例.NET 4.5 example

async public Task NewContosoChatMessage(string name, string message)
{
    await Clients.Others.addContosoChatMessageToPage(data);
    Clients.Caller.notifyMessageSent();
}

.NET 4 の例.NET 4 example

public void NewContosoChatMessage(string name, string message)
{
    (Clients.Others.addContosoChatMessageToPage(data) as Task).ContinueWith(antecedent =>
        Clients.Caller.notifyMessageSent());
}

使用する場合awaitまたはContinueWithクライアント メソッドは、次のコード行が実行される前に完了するまで待機するわけクライアントが実際にメッセージが表示される前に、次のコード行を実行します。If you use await or ContinueWith to wait until a client method finishes before the next line of code executes, that does not mean that clients will actually receive the message before the next line of code executes. のみのクライアント メソッドの呼び出しには、「完了」は、SignalR がすべてのメッセージを送信するために必要な終了することを意味します。"Completion" of a client method call only means that SignalR has done everything necessary to send the message. クライアントがメッセージを受信することの確認が必要な場合、そのメカニズムを自分でプログラムがあります。If you need verification that clients received the message, you have to program that mechanism yourself. たとえば、コーディングする可能性があります、MessageReceivedメソッドと、ハブで、addContosoChatMessageToPageメソッドを呼び出すことも、クライアントをMessageReceivedその後はすべて使用するクライアントで実行する必要があります。For example, you could code a MessageReceived method on the Hub, and in the addContosoChatMessageToPage method on the client you could call MessageReceived after you do whatever work you need to do on the client. MessageReceivedハブでどのような作業は、実際のクライアントの受信と、元のメソッド呼び出しの処理によって異なります。 を実行できます。In MessageReceived in the Hub you can do whatever work depends on actual client reception and processing of the original method call.

メソッドの名前として文字列変数を使用する方法How to use a string variable as the method name

キャスト、メソッド名と文字列変数を使用してクライアント メソッドを呼び出す場合Clients.All(またはClients.OthersClients.Callerなど) にIClientProxyを呼び出してInvoke (methodName, args…).If you want to invoke a client method by using a string variable as the method name, cast Clients.All (or Clients.Others, Clients.Caller, etc.) to IClientProxy and then call Invoke(methodName, args...).

public void NewContosoChatMessage(string name, string message)
{
    string methodToCall = "addContosoChatMessageToPage";
    IClientProxy proxy = Clients.All;
    proxy.Invoke(methodToCall, name, message);
}

Hub クラスからグループ メンバーシップを管理する方法How to manage group membership from the Hub class

SignalR でグループは、接続されているクライアントのサブセットを指定するメッセージをブロードキャストする方法を提供します。Groups in SignalR provide a method for broadcasting messages to specified subsets of connected clients. グループは、クライアントの任意の数を持つことができ、クライアントは任意の数のグループのメンバーであることができます。A group can have any number of clients, and a client can be a member of any number of groups.

グループのメンバーシップを管理するを使用して、追加削除によって提供されるメソッド、Groupsハブ クラスのプロパティ。To manage group membership, use the Add and Remove methods provided by the Groups property of the Hub class. 次の例は、Groups.AddGroups.Remove呼び出し元となる JavaScript クライアント コードの後に、クライアント コードによって呼び出されるハブ メソッドで使用されるメソッド。The following example shows the Groups.Add and Groups.Remove methods used in Hub methods that are called by client code, followed by JavaScript client code that calls them.

サーバーServer

public class ContosoChatHub : Hub
{
    public Task JoinGroup(string groupName)
    {
        return Groups.Add(Context.ConnectionId, groupName);
    }

    public Task LeaveGroup(string groupName)
    {
        return Groups.Remove(Context.ConnectionId, groupName);
    }
}

生成されたプロキシを使用して JavaScript クライアントJavaScript client using generated proxy

contosoChatHubProxy.server.joinGroup(groupName);
contosoChatHubProxy.server.leaveGroup(groupName);

グループを明示的に作成する必要はありません。You don't have to explicitly create groups. 有効なグループが初めての呼び出しでその名前を指定する自動的に作成Groups.Add、そのメンバーシップから最後の接続を削除すると削除されます。In effect a group is automatically created the first time you specify its name in a call to Groups.Add, and it is deleted when you remove the last connection from membership in it.

グループ メンバーシップの一覧またはグループの一覧を取得するための API はありません。There is no API for getting a group membership list or a list of groups. SignalR では、クライアントとグループを基にメッセージを送信するパブリッシュ/サブスクライブ モデル、し、サーバーがグループまたはグループ メンバーシップの一覧を保持しません。SignalR sends messages to clients and groups based on a pub/sub model, and the server does not maintain lists of groups or group memberships. こうため、SignalR を保持する任意の状態が新しいノードに適用するのには web ファームにノードを追加するたびに、スケーラビリティを最大化します。This helps maximize scalability, because whenever you add a node to a web farm, any state that SignalR maintains has to be propagated to the new node.

Add および Remove メソッドの非同期実行Asynchronous execution of Add and Remove methods

Groups.AddGroups.Removeメソッドが非同期的に実行します。The Groups.Add and Groups.Remove methods execute asynchronously. クライアント グループを追加して、すぐに、グループを使用して、クライアントにメッセージを送信する場合は、ことを確認する必要がある、Groups.Addメソッドが最初に終了しました。If you want to add a client to a group and immediately send a message to the client by using the group, you have to make sure that the Groups.Add method finishes first. 次のコード例は、その .NET 4.5、および .NET 4 で動作するコードを使用していずれかで動作するコードを使用して 1 つの方法を表示します。The following code examples show how to do that, one by using code that works in .NET 4.5, and one by using code that works in .NET 4

.NET 4.5 の例.NET 4.5 example

async public Task JoinGroup(string groupName)
{
    await Groups.Add(Context.ConnectionId, groupName);
    Clients.Group(groupname).addContosoChatMessageToPage(Context.ConnectionId + " added to group");
}

.NET 4 の例.NET 4 example

public void JoinGroup(string groupName)
{
    (Groups.Add(Context.ConnectionId, groupName) as Task).ContinueWith(antecedent =>
        Clients.Group(groupName).addContosoChatMessageToPage(Context.ConnectionId + " added to group"));
}

グループ メンバーシップの永続化Group membership persistence

SignalR 接続の追跡、ユーザーが同じグループにユーザーを確立するたびに接続するユーザーではなく、その場合を呼び出す必要がGroups.Addたびに、ユーザーが新しい接続を確立します。SignalR tracks connections, not users, so if you want a user to be in the same group every time the user establishes a connection, you have to call Groups.Add every time the user establishes a new connection.

接続の一時的な喪失、後に場合があります SignalR ことができます、接続を自動的に復元します。After a temporary loss of connectivity, sometimes SignalR can restore the connection automatically. その場合は、SignalR は、同じ接続を復元は、新しい接続を確立できませんし、そのため、クライアントのグループのメンバーシップが自動的に復元します。In that case, SignalR is restoring the same connection, not establishing a new connection, and so the client's group membership is automatically restored. これは可能なサーバーの再起動または失敗の結果が場合でも、一時的な中断がグループのメンバーシップを含む、各クライアントの接続状態をクライアントにラウンドト リップします。This is possible even when the temporary break is the result of a server reboot or failure, because connection state for each client, including group memberships, is round-tripped to the client. サーバーが停止して、接続がタイムアウトする前に、新しいサーバーに置換される場合、クライアントは、新しいサーバーに自動的に再接続し、再登録するグループのメンバーであります。If a server goes down and is replaced by a new server before the connection times out, a client can reconnect automatically to the new server and re-enroll in groups it is a member of.

接続は、接続の喪失後に自動的に復元できない場合にまたは接続がタイムアウトしたときに、(たとえば、ブラウザーは、新しいページに移動します) 場合、クライアントが切断されたときは、グループ メンバーシップは失われます。When a connection can't be restored automatically after a loss of connectivity, or when the connection times out, or when the client disconnects (for example, when a browser navigates to a new page), group memberships are lost. 次に、ユーザーが接続したときは、新しい接続になります。The next time the user connects will be a new connection. を、同じユーザーが新しい接続が確立されるときのグループ メンバーシップを維持するには、アプリケーションは、ユーザーとグループの間の関連付けを追跡し、ユーザーが新しい接続を確立するたびにグループ メンバーシップを復元するがします。To maintain group memberships when the same user establishes a new connection, your application has to track the associations between users and groups, and restore group memberships each time a user establishes a new connection.

接続と再接続に関する詳細については、次を参照してください。ハブ クラスでの接続の有効期間イベントを処理する方法このトピックで後述します。For more information about connections and reconnections, see How to handle connection lifetime events in the Hub class later in this topic.

シングル ユーザー グループSingle-user groups

どのユーザーがメッセージを送信し、どのユーザーにメッセージを受信する必要がありますを知るためには、ユーザーと接続間の関連付けを追跡する必要は通常、SignalR を使用するアプリケーション。Applications that use SignalR typically have to keep track of the associations between users and connections in order to know which user has sent a message and which user(s) should be receiving a message. グループは、これを行うための 2 つの一般的に使用されるパターンのいずれかで使用されます。Groups are used in one of the two commonly used patterns for doing that.

  • シングル ユーザーのグループ。Single-user groups.

    グループ名としてユーザー名を指定でき、ユーザーが接続または再接続するたびに、現在の接続 ID をグループに追加することができます。You can specify the user name as the group name, and add the current connection ID to the group every time the user connects or reconnects. ユーザー、グループに送信するには、メッセージを送信します。To send messages to the user you send to the group. この方法の欠点は、グループを調べるかどうか、ユーザーはオンラインまたはオフラインにするに提供します。A disadvantage of this method is that the group doesn't provide you with a way to find out if the user is online or offline.

  • ユーザー名と接続 Id の間の関連付けを追跡します。Track associations between user names and connection IDs.

    ディクショナリまたはデータベース内の各ユーザー名と 1 つまたは複数の接続 Id 間のアソシエーションを格納し、ユーザーが接続または切断するたびに、格納されたデータを更新できます。You can store an association between each user name and one or more connection IDs in a dictionary or database, and update the stored data each time the user connects or disconnects. ユーザーにメッセージを送信するには、接続 Id を指定します。To send messages to the user you specify the connection IDs. この方法の欠点より多くのメモリがかかることです。A disadvantage of this method is that it takes more memory.

ハブ クラスでの接続の有効期間イベントを処理する方法How to handle connection lifetime events in the Hub class

接続の有効期間イベントを処理するための一般的な原因としてとユーザー名と接続 Id 間の関連付けを追跡するか、ユーザーが接続されているかどうかを追跡するのには。Typical reasons for handling connection lifetime events are to keep track of whether a user is connected or not, and to keep track of the association between user names and connection IDs. クライアントが接続または切断ときは、独自のコードを実行するには、オーバーライド、 OnConnectedOnDisconnected、およびOnReconnectedハブの仮想メソッドをクラスの次の例で示す。To run your own code when clients connect or disconnect, override the OnConnected, OnDisconnected, and OnReconnected virtual methods of the Hub class, as shown in the following example.

public class ContosoChatHub : Hub
{
    public override Task OnConnected()
    {
        // Add your own code here.
        // For example: in a chat application, record the association between
        // the current connection ID and user name, and mark the user as online.
        // After the code in this method completes, the client is informed that
        // the connection is established; for example, in a JavaScript client,
        // the start().done callback is executed.
        return base.OnConnected();
    }

    public override Task OnDisconnected()
    {
        // Add your own code here.
        // For example: in a chat application, mark the user as offline, 
        // delete the association between the current connection id and user name.
        return base.OnDisconnected();
    }

    public override Task OnReconnected()
    {
        // Add your own code here.
        // For example: in a chat application, you might have marked the
        // user as offline after a period of inactivity; in that case 
        // mark the user as online again.
        return base.OnReconnected();
    }
}

OnConnected、OnDisconnected、OnReconnected を呼び出すときにWhen OnConnected, OnDisconnected, and OnReconnected are called

ブラウザーが新しいページに移動するたびに新しい接続でが確立されているため、SignalR は実行、OnDisconnectedメソッドに続けて、OnConnectedメソッド。Each time a browser navigates to a new page, a new connection has to be established, which means SignalR will execute the OnDisconnected method followed by the OnConnected method. SignalR は、新しい接続が確立されたときに常に新しい接続 ID を作成します。SignalR always creates a new connection ID when a new connection is established.

OnReconnectedメソッドが呼び出されますが、一時中断 SignalR がときに、ケーブルが一時的に切断され、再接続、接続がタイムアウトする前になどから、回復できるように自動的に接続します。OnDisconnectedクライアントを切断して SignalR 自動的に再接続できないなど、ブラウザーが新しいページに移動するときにメソッドが呼び出されます。The OnReconnected method is called when there has been a temporary break in connectivity that SignalR can automatically recover from, such as when a cable is temporarily disconnected and reconnected before the connection times out. The OnDisconnected method is called when the client is disconnected and SignalR can't automatically reconnect, such as when a browser navigates to a new page. そのため、特定のクライアントのイベントの可能なシーケンスはOnConnectedOnReconnectedOnDisconnected; またはOnConnectedOnDisconnectedします。Therefore, a possible sequence of events for a given client is OnConnected, OnReconnected, OnDisconnected; or OnConnected, OnDisconnected. シーケンスは表示されませんOnConnectedOnDisconnectedOnReconnected特定の接続。You won't see the sequence OnConnected, OnDisconnected, OnReconnected for a given connection.

OnDisconnectedメソッドなど、サーバーがダウンしたときに、一部のシナリオで呼び出されませんまたはアプリケーション ドメインが再利用されます。The OnDisconnected method doesn't get called in some scenarios, such as when a server goes down or the App Domain gets recycled. 別のサーバーがオンラインにするか、アプリ ドメインのリサイクルが完了すると、一部のクライアントが再接続して起動できるようになることがあります、OnReconnectedイベント。When another server comes on line or the App Domain completes its recycle, some clients may be able to reconnect and fire the OnReconnected event.

詳細については、次を参照してください。 SignalR の接続の有効期間イベントの処理と理解します。For more information, see Understanding and Handling Connection Lifetime Events in SignalR.

設定されていない呼び出し元の状態Caller state not populated

任意の状態に格納されていることを意味するサーバーからの接続の有効期間イベント ハンドラー メソッドが呼び出される、stateで、クライアント上のオブジェクトは設定されません、Callerサーバーのプロパティ。The connection lifetime event handler methods are called from the server, which means that any state that you put in the state object on the client will not be populated in the Caller property on the server. については、stateオブジェクトとCallerプロパティを参照してくださいクライアントとハブ クラス間で状態を渡す方法このトピックで後述します。For information about the state object and the Caller property, see How to pass state between clients and the Hub class later in this topic.

コンテキスト プロパティからのクライアントに関する情報を取得する方法How to get information about the client from the Context property

クライアントに関する情報を取得する、Contextハブ クラスのプロパティ。To get information about the client, use the Context property of the Hub class. Contextプロパティが返す、 HubCallerContext次の情報へのアクセスを提供するオブジェクト。The Context property returns a HubCallerContext object which provides access to the following information:

  • 呼び出し元のクライアントの接続 ID。The connection ID of the calling client.

    string connectionID = Context.ConnectionId;
    

    接続 ID は、SignalR (値は、独自のコードでは指定できません) によって割り当てられた GUID です。The connection ID is a GUID that is assigned by SignalR (you can't specify the value in your own code). 同じ接続 ID は、アプリケーションで複数のハブがある場合、すべてのハブで使用し、各接続の 1 つの接続 ID があります。There is one connection ID for each connection, and the same connection ID is used by all Hubs if you have multiple Hubs in your application.

  • HTTP ヘッダーのデータ。HTTP header data.

    System.Collections.Specialized.NameValueCollection headers = Context.Request.Headers;
    

    HTTP ヘッダーを取得することもできます。Context.Headersします。You can also get HTTP headers from Context.Headers. 多重参照を同じことには、その理由はContext.Headersが最初に、作成された、Context.Requestプロパティが追加された後とContext.Headers旧バージョンと互換性が保持されます。The reason for multiple references to the same thing is that Context.Headers was created first, the Context.Request property was added later, and Context.Headers was retained for backward compatibility.

  • 文字列データのクエリを実行します。Query string data.

    System.Collections.Specialized.NameValueCollection queryString = Context.Request.QueryString;
    string parameterValue = queryString["parametername"]
    

    クエリの文字列データを取得することもContext.QueryStringします。You can also get query string data from Context.QueryString.

    このプロパティで取得するクエリ文字列確立された SignalR 接続 HTTP 要求で使用されていたです。The query string that you get in this property is the one that was used with the HTTP request that established the SignalR connection. クライアントでは、クライアントからサーバーにクライアントに関するデータを渡すに便利ですが、接続を構成することでクエリ文字列パラメーターを追加できます。You can add query string parameters in the client by configuring the connection, which is a convenient way to pass data about the client from the client to the server. 次の例では、生成されたプロキシを使用すると、JavaScript クライアント内でクエリ文字列を追加する 1 つの方法を示します。The following example shows one way to add a query string in a JavaScript client when you use the generated proxy.

    $.connection.hub.qs = { "version" : "1.0" };
    

    クエリ文字列パラメーターを設定する方法についての詳細については、API ガイドを参照してください、 JavaScript.NETクライアント。For more information about setting query string parameters, see the API guides for the JavaScript and .NET clients.

    SignalR によって内部的に使用されるその他のいくつかの値と共に、クエリ文字列のデータの接続に使用されるトランスポート メソッドがあります。You can find the transport method used for the connection in the query string data, along with some other values used internally by SignalR:

    string transportMethod = queryString["transport"];
    

    transportMethod"Websocket"、"serverSentEvents"、"foreverFrame"または"longPolling"になります。The value of transportMethod will be "webSockets", "serverSentEvents", "foreverFrame" or "longPolling". この値を確認する場合、OnConnectedイベント ハンドラー メソッドでは、一部のシナリオで、接続のネゴシエートされたトランスポートの最終的なメソッドではないトランスポートの値を取得する可能性があります最初にします。Note that if you check this value in the OnConnected event handler method, in some scenarios you might initially get a transport value that is not the final negotiated transport method for the connection. その場合は、メソッドは、例外がスローされ、最終的なトランスポート メソッドが確立されたときに後でもう一度呼び出されます。In that case the method will throw an exception and will be called again later when the final transport method is established.

  • クッキー。Cookies.

    System.Collections.Generic.IDictionary<string, Cookie> cookies = Context.Request.Cookies;
    

    Cookie を取得することもできます。Context.RequestCookiesします。You can also get cookies from Context.RequestCookies.

  • ユーザー情報。User information.

    System.Security.Principal.IPrincipal user = Context.User;
    
  • 要求の HttpContext オブジェクト:The HttpContext object for the request :

    System.Web.HttpContextBase httpContext = Context.Request.GetHttpContext();
    

    このメソッドを使用して取得する代わりにHttpContext.Currentを取得する、 HttpContext SignalR 接続のオブジェクト。Use this method instead of getting HttpContext.Current to get the HttpContext object for the SignalR connection.

クライアントとハブ クラス間で状態を渡す方法How to pass state between clients and the Hub class

クライアント プロキシを提供するstateオブジェクトの各メソッドの呼び出しで、サーバーに送信するデータを保存できます。The client proxy provides a state object in which you can store data that you want to be transmitted to the server with each method call. サーバー上でこのデータにアクセスすることができます、Clients.Callerクライアントによって呼び出されるハブ メソッドでプロパティ。On the server you can access this data in the Clients.Caller property in Hub methods that are called by clients. Clients.Callerプロパティは設定されませんが、接続の有効期間イベントのハンドラー メソッドOnConnectedOnDisconnected、およびOnReconnectedします。The Clients.Caller property is not populated for the connection lifetime event handler methods OnConnected, OnDisconnected, and OnReconnected.

作成または更新でのデータ、stateオブジェクトとClients.Callerプロパティが双方向で機能します。Creating or updating data in the state object and the Clients.Caller property works in both directions. サーバーで値を更新して、クライアントに渡されます。You can update values in the server and they are passed back to the client.

次の例では、すべてのメソッド呼び出しで、サーバーに送信する状態を格納する JavaScript クライアント コードを示します。The following example shows JavaScript client code that stores state for transmission to the server with every method call.

contosoChatHubProxy.state.userName = "Fadi Fakhouri";
contosoChatHubProxy.state.computerName = "fadivm1";

次の例では、.NET クライアントでの同等のコードを示します。The following example shows the equivalent code in a .NET client.

contosoChatHubProxy["userName"] = "Fadi Fakhouri";
chatHubProxy["computerName"] = "fadivm1";

ハブ クラス内でこのデータにアクセスすることができます、Clients.Callerプロパティ。In your Hub class, you can access this data in the Clients.Caller property. 次の例では、前の例で参照される状態を取得するコードを示します。The following example shows code that retrieves the state referred to in the previous example.

public void NewContosoChatMessage(string data)
{
    string userName = Clients.Caller.userName;
    string computerName = Clients.Caller.computerName;
    Clients.Others.addContosoChatMessageToPage(message, userName, computerName);
}

Note

状態を保持するためには、このメカニズムはありません大量のデータをすべてを配置した後、stateまたはClients.Callerプロパティは、メソッド呼び出しのたびにラウンド トリップします。This mechanism for persisting state is not intended for large amounts of data, since everything you put in the state or Clients.Caller property is round-tripped with every method invocation. ユーザー名やカウンターなどの小さい項目と便利です。It's useful for smaller items such as user names or counters.

ハブ クラスのエラーを処理する方法How to handle errors in the Hub class

ハブ クラスのメソッドで発生するエラーを処理するには、次のメソッドの一方または両方を使用します。To handle errors that occur in your Hub class methods, use one or both of the following methods:

  • Try catch ブロックでは、メソッドのコードをラップし、例外オブジェクトを記録します。Wrap your method code in try-catch blocks and log the exception object. デバッグの目的では、クライアントに例外を送信できますが、セキュリティ上の理由から運用環境でクライアントに詳細な情報を送信することはお勧めしません。For debugging purposes you can send the exception to the client, but for security reasons sending detailed information to clients in production is not recommended.

  • 処理するハブ パイプライン モジュールを作成、 OnIncomingErrorメソッド。Create a Hubs pipeline module that handles the OnIncomingError method. 次の例では、モジュールをハブ パイプラインに挿入する Global.asax 内のコードの後に、エラー ログに記録するパイプラインのモジュールを示します。The following example shows a pipeline module that logs errors, followed by code in Global.asax that injects the module into the Hubs pipeline.

    public class ErrorHandlingPipelineModule : HubPipelineModule
    {
        protected override void OnIncomingError(Exception ex, IHubIncomingInvokerContext context)
        {
            Debug.WriteLine("=> Exception " + ex.Message);
            if (ex.InnerException != null)
            {
                Debug.WriteLine("=> Inner Exception " + ex.InnerException.Message);
            }
            base.OnIncomingError(ex, context);
        }
    }
    
    protected void Application_Start(object sender, EventArgs e)
    {
        GlobalHost.HubPipeline.AddModule(new ErrorHandlingPipelineModule()); 
        RouteTable.Routes.MapHubs();
    }
    

ハブ パイプライン モジュールの詳細については、次を参照してください。ハブ パイプラインをカスタマイズする方法についてこのトピックで後述します。For more information about Hub pipeline modules, see How to customize the Hubs pipeline later in this topic.

トレースを有効にする方法How to enable tracing

サーバー側トレースを有効にするには、この例で示すように、Web.config ファイルに system.diagnostics 要素を追加します。To enable server-side tracing, add a system.diagnostics element to your Web.config file, as shown in this example:

<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <connectionStrings>
    <add name="SignalRSamples" connectionString="Data Source=(local);Initial Catalog=SignalRSamples;Integrated Security=SSPI;Asynchronous Processing=True;" />
    <add name="SignalRSamplesWithMARS" connectionString="Data Source=(local);Initial Catalog=SignalRSamples;Integrated Security=SSPI;Asynchronous Processing=True;MultipleActiveResultSets=true;" />
  </connectionStrings>
  <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5" />
  </system.web>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
  </system.webServer>
  <system.diagnostics>
    <sources>
      <source name="SignalR.SqlMessageBus">
        <listeners>
          <add name="SignalR-Bus" />
        </listeners>
      </source>
     <source name="SignalR.ServiceBusMessageBus">
        <listeners>
            <add name="SignalR-Bus" />
        </listeners>
     </source>
     <source name="SignalR.ScaleoutMessageBus">
        <listeners>
            <add name="SignalR-Bus" />
        </listeners>
      </source>
      <source name="SignalR.Transports.WebSocketTransport">
        <listeners>
          <add name="SignalR-Transports" />
        </listeners>
      </source>
      <source name="SignalR.Transports.ServerSentEventsTransport">
          <listeners>
              <add name="SignalR-Transports" />
          </listeners>
      </source>
      <source name="SignalR.Transports.ForeverFrameTransport">
          <listeners>
              <add name="SignalR-Transports" />
          </listeners>
      </source>
      <source name="SignalR.Transports.LongPollingTransport">
        <listeners>
            <add name="SignalR-Transports" />
        </listeners>
      </source>
      <source name="SignalR.Transports.TransportHeartBeat">
        <listeners>
            <add name="SignalR-Transports" />
        </listeners>
      </source>
    </sources>
    <switches>
      <add name="SignalRSwitch" value="Verbose" />
    </switches>
    <sharedListeners>
      <add name="SignalR-Transports" 
           type="System.Diagnostics.TextWriterTraceListener" 
           initializeData="transports.log.txt" />
        <add name="SignalR-Bus"
           type="System.Diagnostics.TextWriterTraceListener"
           initializeData="bus.log.txt" />
    </sharedListeners>
    <trace autoflush="true" />
  </system.diagnostics>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v11.0" />
      </parameters>
    </defaultConnectionFactory>
  </entityFramework>
</configuration>

ログを表示するには Visual Studio でアプリケーションを実行すると、出力ウィンドウ。When you run the application in Visual Studio, you can view the logs in the Output window.

クライアントにメソッドを呼び出し、ハブ クラスの外部からグループを管理する方法How to call client methods and manage groups from outside the Hub class

ハブ クラスよりも別のクラスからクライアント メソッドを呼び出すにハブの SignalR コンテキスト オブジェクトへの参照を取得およびクライアントのメソッドを呼び出すか、グループを管理するに使用します。To call client methods from a different class than your Hub class, get a reference to the SignalR context object for the Hub and use that to call methods on the client or manage groups.

次のサンプルStockTickerクラス コンテキスト オブジェクトを取得、クラスのインスタンスに格納、静的なプロパティで、クラスのインスタンスを格納およびシングルトン クラスのインスタンスからコンテキストを使用して呼び出す、updateStockPriceクライアント上のメソッドという名前のハブに接続されているStockTickerHubします。The following sample StockTicker class gets the context object, stores it in an instance of the class, stores the class instance in a static property, and uses the context from the singleton class instance to call the updateStockPrice method on clients that are connected to a Hub named StockTickerHub.

// For the complete example, go to 
// http://www.asp.net/signalr/overview/signalr-1x/getting-started/tutorial-server-broadcast-with-aspnet-signalr
// This sample only shows code related to getting and using the SignalR context.
public class StockTicker
{
    // Singleton instance
    private readonly static Lazy<StockTicker> _instance = new Lazy<StockTicker>(
        () => new StockTicker(GlobalHost.ConnectionManager.GetHubContext<StockTickerHub>()));

    private IHubContext _context;

    private StockTicker(IHubContext context)
    {
        _context = context;
    }

    // This method is invoked by a Timer object.
    private void UpdateStockPrices(object state)
    {
        foreach (var stock in _stocks.Values)
        {
            if (TryUpdateStockPrice(stock))
            {
                _context.Clients.All.updateStockPrice(stock);
            }
        }
    }

有効期間が長いオブジェクト コンテキストの複数回を使用する必要がある場合は、1 回の参照を取得しよりも、毎回の取得を保存します。If you need to use the context multiple-times in a long-lived object, get the reference once and save it rather than getting it again each time. コンテキストを 1 回取得すると、SignalR がメッセージをハブのメソッド、クライアントのメソッドの呼び出しと同じシーケンス内のクライアントに送信するようにします。Getting the context once ensures that SignalR sends messages to clients in the same sequence in which your Hub methods make client method invocations. ハブの SignalR コンテキストを使用する方法を示すチュートリアルについては、次を参照してください。 ASP.NET SignalR によるサーバー ブロードキャストします。For a tutorial that shows how to use the SignalR context for a Hub, see Server Broadcast with ASP.NET SignalR.

クライアントのメソッドを呼び出すCalling client methods

RPC を受信するクライアントを指定できますが、ハブ クラスから呼び出す場合よりも少ないオプションがあります。You can specify which clients will receive the RPC, but you have fewer options than when you call from a Hub class. この理由は、すべてのメソッドを必要とする現在の接続 ID のサポート技術情報など、コンテキストがクライアントから、特定の呼び出しに関連付けられていないClients.Others、またはClients.Caller、またはClients.OthersInGroupは使用できません。The reason for this is that the context is not associated with a particular call from a client, so any methods that require knowledge of the current connection ID, such as Clients.Others, or Clients.Caller, or Clients.OthersInGroup, are not available. 次のオプションを使用できます。The following options are available:

  • 接続されているすべてのクライアント。All connected clients.

    context.Clients.All.addContosoChatMessageToPage(name, message);
    
  • 接続 ID で識別される特定のクライアントA specific client identified by connection ID.

    context.Clients.Client(connectionID).addContosoChatMessageToPage(name, message);
    
  • 接続されているすべてのクライアント接続 ID で識別される、指定されたクライアントを除くAll connected clients except the specified clients, identified by connection ID.

    context.Clients.AllExcept(connectionId1, connectionId2).addContosoChatMessageToPage(name, message);
    
  • すべてには、指定したグループ内のクライアントが接続されています。All connected clients in a specified group.

    context.Clients.Group(groupName).addContosoChatMessageToPage(name, message);
    
  • 接続 ID で識別される、指定されたクライアントを除く、指定したグループに接続されているすべてのクライアントAll connected clients in a specified group except specified clients, identified by connection ID.

    Clients.Group(groupName, connectionId1, connectionId2).addContosoChatMessageToPage(name, message);
    

呼び出す場合、非ハブ クラスにメソッドから、ハブ クラスで、現在の接続 ID を渡すし、を使用してClients.ClientClients.AllExcept、またはClients.GroupをシミュレートするClients.CallerClients.Others、またはClients.OthersInGroupします。If you are calling into your non-Hub class from methods in your Hub class, you can pass in the current connection ID and use that with Clients.Client, Clients.AllExcept, or Clients.Group to simulate Clients.Caller, Clients.Others, or Clients.OthersInGroup. 次の例では、MoveShapeHubクラスに合格する接続 ID、Broadcasterクラスように、BroadcasterクラスをシミュレートできますClients.Othersします。In the following example, the MoveShapeHub class passes the connection ID to the Broadcaster class so that the Broadcaster class can simulate Clients.Others.

// For the complete example, see
// http://www.asp.net/signalr/overview/getting-started/tutorial-high-frequency-realtime-with-signalr
// This sample only shows code that passes connection ID to the non-Hub class,
// in order to simulate Clients.Others.
public class MoveShapeHub : Hub
{
    // Code not shown puts a singleton instance of Broadcaster in this variable.
    private Broadcaster _broadcaster;

    public void UpdateModel(ShapeModel clientModel)
    {
        clientModel.LastUpdatedBy = Context.ConnectionId;
        // Update the shape model within our broadcaster
        _broadcaster.UpdateShape(clientModel);
    }
}

public class Broadcaster
{
    public Broadcaster()
    {
        _hubContext = GlobalHost.ConnectionManager.GetHubContext<MoveShapeHub>();
    }

    public void UpdateShape(ShapeModel clientModel)
    {
        _model = clientModel;
        _modelUpdated = true;
    }

    // Called by a Timer object.
    public void BroadcastShape(object state)
    {
        if (_modelUpdated)
        {
            _hubContext.Clients.AllExcept(_model.LastUpdatedBy).updateShape(_model);
            _modelUpdated = false;
        }
    }
}

グループ メンバーシップを管理します。Managing group membership

グループの管理のハブ クラスの場合と同じオプションがあります。For managing groups you have the same options as you do in a Hub class.

  • クライアントをグループに追加します。Add a client to a group

    context.Groups.Add(connectionID, groupName);
    
  • グループからのクライアントを削除します。Remove a client from a group

    context.Groups.Remove(connectionID, groupName);
    

ハブのパイプラインをカスタマイズする方法How to customize the Hubs pipeline

SignalR では、独自のコードをハブ パイプラインに挿入することができます。SignalR enables you to inject your own code into the Hub pipeline. 次の例は、クライアントとクライアントで呼び出されるメソッド呼び出しの送信から受信した受信した各メソッド呼び出しのログは、カスタム ハブ パイプライン モジュールを示しています。The following example shows a custom Hub pipeline module that logs each incoming method call received from the client and outgoing method call invoked on the client:

public class LoggingPipelineModule : HubPipelineModule 
{ 
    protected override bool OnBeforeIncoming(IHubIncomingInvokerContext context) 
    { 
        Debug.WriteLine("=> Invoking " + context.MethodDescriptor.Name + " on hub " + context.MethodDescriptor.Hub.Name); 
        return base.OnBeforeIncoming(context); 
    }   
    protected override bool OnBeforeOutgoing(IHubOutgoingInvokerContext context) 
    { 
        Debug.WriteLine("<= Invoking " + context.Invocation.Method + " on client hub " + context.Invocation.Hub); 
        return base.OnBeforeOutgoing(context); 
    } 
}

次のコードで、 Global.asaxファイルをハブ パイプラインで実行するモジュールを登録します。The following code in the Global.asax file registers the module to run in the Hub pipeline:

protected void Application_Start(object sender, EventArgs e) 
{ 
    GlobalHost.HubPipeline.AddModule(new LoggingPipelineModule()); 
    RouteTable.Routes.MapHubs();
}

上書き可能なさまざまな方法があります。There are many different methods that you can override. 完全な一覧についてを参照してください。 HubPipelineModule メソッドします。For a complete list, see HubPipelineModule Methods.