ASP.NET SignalR ハブ API ガイド - .NET クライアント (SignalR 1.x)ASP.NET SignalR Hubs API Guide - .NET Client (SignalR 1.x)

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

Warning

このドキュメントは SignalR の最新バージョンはありません。This documentation isn't for the latest version of SignalR. 見てASP.NET Core SignalRします。Take a look at ASP.NET Core SignalR.

このドキュメントでは、SignalR など、Windows ストア (WinRT)、WPF、Silverlight、およびコンソール アプリケーションの .NET クライアントのバージョン 2 の Hubs API の使用の概要を示します。This document provides an introduction to using the Hubs API for SignalR version 2 in .NET clients, such as Windows Store (WinRT), WPF, Silverlight, and console applications.

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:

サンプル .NET クライアント プロジェクトでは、次のリソースを参照してください。For a sample .NET client projects, see the following resources:

サーバーや JavaScript クライアントをプログラミングする方法に関するドキュメントについては、次のリソースを参照してください。For documentation on how to program the server or JavaScript 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.

クライアントのセットアップClient setup

インストール、 Microsoft.AspNet.SignalR.Client NuGet パッケージ (いない、 Microsoft.AspNet.SignalRパッケージ)。Install the Microsoft.AspNet.SignalR.Client NuGet package (not the Microsoft.AspNet.SignalR package). このパッケージは、.NET 4 および .NET 4.5 の両方の WinRT、Silverlight、WPF、コンソール アプリケーション、および Windows Phone のクライアントをサポートします。This package supports WinRT, Silverlight, WPF, console application, and Windows Phone clients, for both .NET 4 and .NET 4.5.

SignalR が存在するクライアントのバージョンがサーバー上にあるバージョンと異なる場合は、SignalR は、違いに適応することが多くの場合。If the version of SignalR that you have on the client is different from the version that you have on the server, SignalR is often able to adapt to the difference. たとえば、SignalR バージョン 2.0 がリリースされ、サーバーをインストールする、サーバーは 1.1.x および 2.0 がインストールされているクライアントをインストールしているクライアントをサポートします。For example, when SignalR version 2.0 is released and you install that on the server, the server will support clients that have 1.1.x installed as well as clients that have 2.0 installed. サーバー上のバージョンと、クライアントのバージョンの間の差が大きすぎる場合は、SignalR がスローされます、InvalidOperationExceptionクライアントが接続を確立しようとした場合に例外が発生します。If the difference between the version on the server and the version on the client is too great, SignalR throws an InvalidOperationException exception when the client tries to establish a connection. エラー メッセージは"You are using a version of the client that isn't compatible with the server. Client version X.X, server version X.X"。The error message is "You are using a version of the client that isn't compatible with the server. Client version X.X, server version X.X".

接続を確立する方法How to establish a connection

作成する必要が接続を確立する前に、HubConnectionオブジェクトし、プロキシを作成します。Before you can establish a connection, you have to create a HubConnection object and create a proxy. 接続を確立するために呼び出す、StartメソッドをHubConnectionオブジェクト。To establish the connection, call the Start method on the HubConnection object.

var hubConnection = new HubConnection("http://www.contoso.com/");
IHubProxy stockTickerHubProxy = hubConnection.CreateHubProxy("StockTickerHub");
stockTickerHubProxy.On<Stock>("UpdateStockPrice", stock => Console.WriteLine("Stock update for {0} new price {1}", stock.Symbol, stock.Price));
await hubConnection.Start();

Note

JavaScript クライアントには、呼び出す前に少なくとも 1 つのイベント ハンドラーを登録する必要が、Startメソッドは、接続を確立します。For JavaScript clients you have to register at least one event handler before calling the Start method to establish the connection. これは、.NET クライアントの必要はありません。This is not necessary for .NET clients. JavaScript クライアントは、生成されたプロキシ コードに自動的に存在するすべてのハブ プロキシをサーバーを作成、およびハンドラーの登録は、どのハブを指定する方法、クライアントが使用します。For JavaScript clients, the generated proxy code automatically creates proxies for all Hubs that exist on the server, and registering a handler is how you indicate which Hubs your client intends to use. .NET クライアントのハブ プロキシ手動で作成するため、SignalR のプロキシを作成するのいずれかのハブを使用することを想定しています。But for a .NET client you create Hub proxies manually, so SignalR assumes that you will be using any Hub that you create a proxy for.

サンプル コードは、既定値を使用して"/signalr"SignalR サービスに接続するための URL。The sample code uses the default "/signalr" URL to connect to your SignalR service. 別の基本 URL を指定する方法については、次を参照してください。 ASP.NET SignalR ハブ API ガイド - サーバー -/signalr URLします。For information about how to specify a different base URL, see ASP.NET SignalR Hubs API Guide - Server - The /signalr URL.

Startメソッドを非同期的に実行します。The Start method executes asynchronously. 後続行のコードは、接続が確立された後まで実行されないようにするには、次のように使用します。 await ASP.NET 4.5 の非同期メソッドまたは.Wait()同期メソッドにします。To make sure that subsequent lines of code don't execute until after the connection is established, use await in an ASP.NET 4.5 asynchronous method or .Wait() in a synchronous method. 使用しない.Wait()WinRT クライアント。Don't use .Wait() in a WinRT client.

await connection.Start();
connection.Start().Wait();

HubConnection クラスはスレッド セーフです。The HubConnection class is thread-safe.

Silverlight クライアントからドメイン間の接続Cross-domain connections from Silverlight clients

Silverlight クライアントからドメイン間の接続を有効にする方法については、次を参照してください。使用可能なドメインの境界を越えてサービスを行うします。For information about how to enable cross-domain connections from Silverlight clients, see Making a Service Available Across Domain Boundaries.

接続を構成する方法How to configure the connection

接続を確立する前に、次のオプションのいずれかを指定できます。Before you establish a connection, you can specify any of the following options:

  • 同時接続数を制限します。Concurrent connections limit.
  • クエリ文字列パラメーター。Query string parameters.
  • トランスポート メソッド。The transport method.
  • HTTP ヘッダー。HTTP headers.
  • クライアント証明書。Client certificates.

WPF クライアントでの同時接続の最大数を設定する方法How to set the maximum number of concurrent connections in WPF clients

、WPF のクライアントでは、2 の既定値からの同時接続の最大数を増やす必要があります。In WPF clients, you might have to increase the maximum number of concurrent connections from its default value of 2. 推奨値には 10 です。The recommended value is 10.

var hubConnection = new HubConnection("http://www.contoso.com/");
IHubProxy stockTickerHubProxy = hubConnection.CreateHubProxy("StockTickerHub");
stockTickerHubProxy.On<Stock>("UpdateStockPrice", stock => Console.WriteLine("Stock update for {0} new price {1}", stock.Symbol, stock.Price));
ServicePointManager.DefaultConnectionLimit = 10;
await hubConnection.Start();

詳細については、次を参照してください。 ServicePointManager.DefaultConnectionLimitします。For more information, see ServicePointManager.DefaultConnectionLimit.

クエリ文字列パラメーターを指定する方法How to specify query string parameters

クライアントが接続するときに、サーバーにデータを送信する場合は、接続オブジェクトをクエリ文字列パラメーターを追加できます。If you want to send data to the server when the client connects, you can add query string parameters to the connection object. 次の例では、クライアント コードで、クエリ文字列パラメーターを設定する方法を示します。The following example shows how to set a query string parameter in client code.

var querystringData = new Dictionary<string, string>();
querystringData.Add("contosochatversion", "1.0");
var connection = new HubConnection("http://contoso.com/", querystringData);

次の例では、サーバー コードでクエリ文字列パラメーターを読み取る方法を示します。The following example shows how to read a query string parameter in server code.

public class StockTickerHub : Hub
{
    public override Task OnConnected()
    {
        var version = Context.QueryString["contosochatversion"];
        if (version != "1.0")
        {
            Clients.Caller.notifyWrongVersion();
        }
        return base.OnConnected();
    }
}

トランスポート メソッドを指定する方法How to specify the transport method

接続するプロセスの一環として、SignalR クライアントは、通常サーバーとクライアントの両方でサポートされている最適なトランスポートを決定する、サーバーとネゴシエートします。As part of the process of connecting, a SignalR client normally negotiates with the server to determine the best transport that is supported by both server and client. 使用するトランスポートを既に知っている場合は、このネゴシエーション プロセスをバイパスできます。If you already know which transport you want to use, you can bypass this negotiation process. トランスポートの方法を指定するには、Start メソッドにトランスポート オブジェクトで渡します。To specify the transport method, pass in a transport object to the Start method. 次の例では、クライアント コードでトランスポート メソッドを指定する方法を示します。The following example shows how to specify the transport method in client code.

var hubConnection = new HubConnection("http://www.contoso.com/");
IHubProxy stockTickerHubProxy = hubConnection.CreateHubProxy("StockTickerHub");
stockTickerHubProxy.On<Stock>("UpdateStockPrice", stock => Console.WriteLine("Stock update for {0} new price {1}", stock.Symbol, stock.Price));
await hubConnection.Start(new LongPollingTransport());

Microsoft.AspNet.SignalR.Client.Transports名前空間には、トランスポートを指定する際、次のクラスが含まれています。The Microsoft.AspNet.SignalR.Client.Transports namespace includes the following classes that you can use to specify the transport.

  • LongPollingTransportLongPollingTransport
  • ServerSentEventsTransportServerSentEventsTransport
  • WebSocketTransport (サーバーとクライアントの両方が .NET 4.5 を使用した場合にのみ表示されます)。WebSocketTransport (Available only when both server and client use .NET 4.5.)
  • AutoTransport (クライアントとサーバーの両方でサポートされている最適なトランスポートを自動的に選択します。AutoTransport (Automatically chooses the best transport that is supported by both the client and the server. これは、既定のトランスポートです。This is the default transport. 渡すをこれには、Startメソッドが何もで渡されていないのと同じ効果です)。Passing this in to the Start method has the same effect as not passing in anything.)

ブラウザーでのみ使用されているために、ForeverFrame トランスポートはこの一覧に含まれていません。The ForeverFrame transport is not included in this list because it is used only by browsers.

サーバー コードでの転送方法を確認する方法については、次を参照してください。 ASP.NET SignalR ハブ API ガイド - サーバーのコンテキスト プロパティからのクライアントに関する情報を取得する方法します。For information about how to check the transport method in server code, see ASP.NET SignalR Hubs API Guide - Server - How to get information about the client from the Context property. トランスポートとフォールバックの詳細については、次を参照してください。 SignalR のトランスポートとフォールバックの概要します。For more information about transports and fallbacks, see Introduction to SignalR - Transports and Fallbacks.

HTTP ヘッダーを指定する方法How to specify HTTP headers

HTTP ヘッダーを設定するには、使用、Headers接続オブジェクトのプロパティ。To set HTTP headers, use the Headers property on the connection object. 次の例では、HTTP ヘッダーを追加する方法を示します。The following example shows how to add an HTTP header.

hubConnection = new hubConnection("http://www.contoso.com/");
connection.Headers.Add("headername", "headervalue");
IHubProxy stockTickerHubProxy = hubConnection.CreateHubProxy("StockTickerHub");
stockTickerHubProxy.On<Stock>("UpdateStockPrice", stock => Console.WriteLine("Stock update for {0} new price {1}", stock.Symbol, stock.Price));
await connection.Start();

クライアント証明書を指定する方法How to specify client certificates

クライアント証明書を追加するには、使用、AddClientCertificate接続オブジェクトのメソッド。To add client certificates, use the AddClientCertificate method on the connection object.

hubConnection = new hubConnection("http://www.contoso.com/");
hubConnection.AddClientCertificate(X509Certificate.CreateFromCertFile("MyCert.cer"));
IHubProxy stockTickerHubProxy = hubConnection.CreateHubProxy("StockTickerHub");
stockTickerHubProxy.On<Stock>("UpdateStockPrice", stock => Console.WriteLine("Stock update for {0} new price {1}", stock.Symbol, stock.Price));
await connection.Start();

ハブ プロキシを作成する方法How to create the Hub proxy

ハブは、サーバーから呼び出すことができるクライアントでメソッドを定義するとで、サーバーでのハブ メソッドを呼び出すには、呼び出すことによって、ハブのプロキシの作成CreateHubProxy接続オブジェクトにします。In order to define methods on the client that a Hub can call from the server, and to invoke methods on a Hub at the server, create a proxy for the Hub by calling CreateHubProxy on the connection object. 文字列に渡すCreateHubProxyは、ハブ クラスの名前またはで指定された名前、HubName属性が 1 つは、サーバーで使用されていた場合。The string you pass in to CreateHubProxy is the name of your Hub class, or the name specified by the HubName attribute if one was used on the server. 大文字と小文字が一致する名前です。Name matching is case-insensitive.

サーバー上のハブ クラスHub class on server

public class StockTickerHub : Hub

ハブ クラス用のクライアント プロキシを作成します。Create client proxy for the Hub class

var hubConnection = new HubConnection("http://www.contoso.com/");
IHubProxy stockTickerHubProxy = hubConnection.CreateHubProxy("StockTickerHub");
stockTickerHubProxy.On<Stock>("UpdateStockPrice", stock => Console.WriteLine("Stock update for {0} new price {1}", stock.Symbol, stock.Price));
await hubConnection.Start();

使用してハブ クラスを修飾する場合、HubName属性、その名前を使用します。If you decorate your Hub class with a HubName attribute, use that name.

サーバー上のハブ クラスHub class on server

[HubName("stockTicker")]
public class StockTickerHub : Hub

ハブ クラス用のクライアント プロキシを作成します。Create client proxy for the Hub class

var hubConnection = new HubConnection("http://www.contoso.com/");
IHubProxy stockTickerHubProxy = hubConnection.CreateHubProxy("stockTicker");
stockTickerHubProxy.On<Stock>("UpdateStockPrice", stock => 
    Console.WriteLine("Stock update for {0} new price {1}", stock.Symbol, stock.Price));
await hubConnection.Start();

プロキシ オブジェクトは、スレッド セーフです。The proxy object is thread-safe. 実際には、呼び出した場合HubConnection.CreateHubProxyで複数回、同じhubName、キャッシュされた同じIHubProxyオブジェクト。In fact, if you call HubConnection.CreateHubProxy multiple times with the same hubName, you get the same cached IHubProxy object.

サーバーが呼び出すことができるクライアントでメソッドを定義する方法How to define methods on the client that the server can call

サーバーが呼び出すことができるメソッドを定義するプロキシを使用して、Onイベント ハンドラーを登録するメソッド。To define a method that the server can call, use the proxy's On method to register an event handler.

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

別のクライアント プラットフォームでは、UI を更新するメソッドのコードを記述する方法のさまざまな要件があります。Different client platforms have different requirements for how you write method code to update the UI. WinRT (Windows ストア .NET) クライアントの表示例を示します。The examples shown are for WinRT (Windows Store .NET) clients. WPF、Silverlight、およびコンソール アプリケーションの例がで提供される別のセクションでは、このトピックで後述します。WPF, Silverlight, and console application examples are provided in a separate section later in this topic.

パラメーターなしのメソッドMethods without parameters

処理しているメソッドにパラメーターがあるない場合は、非ジェネリック オーバー ロードを使用して、Onメソッド。If the method you're handling does not have parameters, use the non-generic overload of the On method:

パラメーターなしのクライアント メソッドを呼び出すサーバー コードServer code calling client method without parameters

public class StockTickerHub : Hub
{
    public void NotifyAllClients()
    {
         Clients.All.Notify();
    }
}

パラメーターなしのサーバーからメソッドの WinRT クライアント コードが呼び出されます (WPF および Silverlight の例をこのトピックの後半を参照してください)。WinRT Client code for method called from server without parameters (see WPF and Silverlight examples later in this topic)

var hubConnection = new HubConnection("http://www.contoso.com/");
IHubProxy stockTickerHubProxy = hubConnection.CreateHubProxy("StockTickerHub");
stockTickerHub.On("notify", () =>
    // Context is a reference to SynchronizationContext.Current
    Context.Post(delegate
    {
        textBox.Text += "Notified!\n";
    }, null)
);
await hubConnection.Start();

パラメーターの型を指定するパラメーターを持つメソッドMethods with parameters, specifying the parameter types

処理しているメソッドにパラメーターがある場合は、パラメーターの型を指定のジェネリック型として、Onメソッド。If the method you're handling has parameters, specify the types of the parameters as the generic types of the On method. ジェネリック オーバー ロードがある、Onメソッドを使用すると、最大 8 個のパラメーター (Windows Phone 7 では 4) を指定します。There are generic overloads of the On method to enable you to specify up to 8 parameters (4 on Windows Phone 7). 次の例に 1 つのパラメーターを送信、UpdateStockPriceメソッド。In the following example, one parameter is sent to the UpdateStockPrice method.

サーバー コードのパラメーターを持つクライアント メソッドを呼び出すServer code calling client method with a parameter

public void BroadcastStockPrice(Stock stock)
{
    context.Clients.Others.UpdateStockPrice(stock);
}

パラメーターに使用される Stock クラスThe Stock class used for the parameter

public class Stock
{
    public string Symbol { get; set; }
    public decimal Price { get; set; }
}

パラメーターを持つサーバーからメソッドの WinRT クライアント コードが呼び出されます (WPF および Silverlight の例をこのトピックの後半を参照してください)。WinRT Client code for a method called from server with a parameter (see WPF and Silverlight examples later in this topic)

stockTickerHubProxy.On<Stock>("UpdateStockPrice", stock => 
    // Context is a reference to SynchronizationContext.Current
    Context.Post(delegate
    {
        textBox.Text += string.Format("Stock update for {0} new price {1}\n", stock.Symbol, stock.Price);
    }, null)
);

パラメーターの動的オブジェクトを指定するパラメーターを持つメソッドMethods with parameters, specifying dynamic objects for the parameters

ジェネリック型としてパラメーターを指定する代わりに、Onメソッドでは、動的オブジェクトとしてパラメーターを指定することができます。As an alternative to specifying parameters as generic types of the On method, you can specify parameters as dynamic objects:

サーバー コードのパラメーターを持つクライアント メソッドを呼び出すServer code calling client method with a parameter

public void BroadcastStockPrice(Stock stock)
{
    context.Clients.Others.UpdateStockPrice(stock);
}

パラメーターに使用される Stock クラスThe Stock class used for the parameter

public class Stock
{
    public string Symbol { get; set; }
    public decimal Price { get; set; }
}

パラメーターの動的オブジェクトを使用して、パラメーターを持つサーバーからメソッドの WinRT クライアント コードが呼び出されます (WPF および Silverlight の例をこのトピックの後半を参照してください)。WinRT Client code for a method called from server with a parameter, using a dynamic object for the parameter (see WPF and Silverlight examples later in this topic)

stockTickerHubProxy.On("UpdateStockPrice", stock => 
    // Context is a reference to SynchronizationContext.Current
    Context.Post(delegate
    {
        textBox.Text += string.Format("Stock update for {0} new price {1}\n", stock.Symbol, stock.Price);
    }, null)
);

ハンドラーを削除する方法How to remove a handler

ハンドラーを削除するには、呼び出すそのDisposeメソッド。To remove a handler, call its Dispose method.

サーバーから呼び出されるメソッドのクライアント コードClient code for a method called from server

var updateStockPriceHandler = stockTickerHubProxy.On<Stock>("UpdateStockPrice", stock => 
    Context.Post(delegate
    {
        textBox.Text += string.Format("Stock update for {0} new price {1}\n", stock.Symbol, stock.Price);
    }, null)
);

クライアントのコード ハンドラーを削除するにはClient code to remove the handler

updateStockPriceHandler.Dispose();

クライアントからサーバーのメソッドを呼び出す方法How to call server methods from the client

サーバー上のメソッドを呼び出すを使用して、Invokeハブ プロキシのメソッド。To call a method on the server, use the Invoke method on the Hub proxy.

サーバー メソッドが戻り値を持たない場合は、非ジェネリック オーバー ロードを使用して、Invokeメソッド。If the server method has no return value, use the non-generic overload of the Invoke method.

サーバー コードのメソッドの戻り値がありません。Server code for a method that has no return value

public class StockTickerHub : Hub
{
    public void JoinGroup(string groupName)
    {
        Groups.Add(Context.ConnectionId, groupName); 
    }
}

戻り値を持たないメソッドを呼び出すクライアント コードClient code calling a method that has no return value

stockTickerHubProxy.Invoke("JoinGroup", hubConnection.ConnectionID, "SignalRChatRoom");

サーバー メソッドの戻り値の場合は、戻り値の型を指定のジェネリック型として、Invokeメソッド。If the server method has a return value, specify the return type as the generic type of the Invoke method.

サーバー コードのメソッドの戻り値があり、複雑な型パラメーターを受け取るServer code for a method that has a return value and takes a complex type parameter

public IEnumerable<Stock> AddStock(Stock stock)
{
    _stockTicker.AddStock(stock);
    return _stockTicker.GetAllStocks();
}

パラメーターと戻り値に使用される Stock クラスThe Stock class used for the parameter and return value

public class Stock
{
    public string Symbol { get; set; }
    public decimal Price { get; set; }
}

ASP.NET 4.5 の非同期メソッドで複合型のパラメーターを受け取って戻り値を持つメソッドを呼び出すクライアント コードClient code calling a method that has a return value and takes a complex type parameter, in an ASP.NET 4.5 async method

var stocks = await stockTickerHub.Invoke<IEnumerable<Stock>>("AddStock", new Stock() { Symbol = "MSFT" });
foreach (Stock stock in stocks)
{
    textBox.Text += string.Format("Symbol: {0} price: {1}\n", stock.Symbol, stock.Price);
}

戻り値を同期メソッドで複合型のパラメーターを受け取るメソッドを呼び出すクライアント コードClient code calling a method that has a return value and takes a complex type parameter, in a synchronous method

var stocks = stockTickerHub.Invoke<IEnumerable<Stock>>("AddStock", new Stock() { Symbol = "MSFT" }).Result;
foreach (Stock stock in stocks)
{
    textBox.Text += string.Format("Symbol: {0} price: {1}\n", stock.Symbol, stock.Price);
}

Invokeメソッドが非同期で実行し、返します、Taskオブジェクト。The Invoke method executes asynchronously and returns a Task object. 指定しない場合はawaitまたは.Wait()、呼び出すメソッドの実行が完了する前に次のコード行が実行されます。If you don't specify await or .Wait(), the next line of code will execute before the method that you invoke has finished executing.

接続の有効期間イベントを処理する方法How to handle connection lifetime events

SignalR は、次の接続に処理できる有効期間イベントを提供します。SignalR provides the following connection lifetime events that you can handle:

  • Received:接続でデータを受信したときに発生します。Received: Raised when any data is received on the connection. 受信したデータを提供します。Provides the received data.
  • ConnectionSlow:クライアントが低速または削除が頻繁に接続を検出したときに発生します。ConnectionSlow: Raised when the client detects a slow or frequently dropping connection.
  • Reconnecting:基になるトランスポートの再接続を開始するときに発生します。Reconnecting: Raised when the underlying transport begins reconnecting.
  • Reconnected:基になるトランスポートが再接続されたときに発生します。Reconnected: Raised when the underlying transport has reconnected.
  • StateChanged:接続状態が変更されたときに発生します。StateChanged: Raised when the connection state changes. 以前の状態と新しい状態を提供します。Provides the old state and the new state. 接続に関する情報の状態の値を参照してくださいConnectionState 列挙します。For information about connection state values see ConnectionState Enumeration.
  • Closed:接続が切断されたときに発生します。Closed: Raised when the connection has disconnected.

たとえば、致命的ではありませんが、断続的な接続の問題が発生するエラーを警告メッセージを表示する場合は、パフォーマンスの低下や頻繁になど、接続の削除を処理、ConnectionSlowイベント。For example, if you want to display warning messages for errors that are not fatal but cause intermittent connection problems, such as slowness or frequent dropping of the connection, handle the ConnectionSlow event.

hubConnection.ConnectionSlow += () => Console.WriteLine("Connection problems.");

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

エラーを処理する方法How to handle errors

場合は、サーバー上の詳細なエラー メッセージを明示的に有効にしない、SignalR が返すエラーが発生した例外オブジェクトには、エラーに関する最小限の情報が含まれています。If you don't explicitly enable detailed error messages on the server, the exception object that SignalR returns after an error contains minimal information about the error. 呼び出しなどnewContosoChatMessage失敗した場合、エラー オブジェクトにエラー メッセージが含まれています"There was an error invoking Hub method 'contosoChatHub.newContosoChatMessage'."送信の詳細なエラー メッセージを有効にする場合は、セキュリティ上の理由の詳細なエラー メッセージを運用環境でクライアントには推奨されませんトラブルシューティングのため、サーバーで次のコードを使用します。For example, if a call to newContosoChatMessage fails, the error message in the error object contains "There was an error invoking Hub method 'contosoChatHub.newContosoChatMessage'." Sending detailed error messages to clients in production is not recommended for security reasons, but if you want to enable detailed error messages for troubleshooting purposes, use the following code on the server.

var hubConfiguration = new HubConfiguration();
hubConfiguration.EnableDetailedErrors = true;
RouteTable.Routes.MapHubs(hubConfiguration);

SignalR が発生したエラーを処理するためのハンドラーを追加できる、Error接続オブジェクトのイベント。To handle errors that SignalR raises, you can add a handler for the Error event on the connection object.

hubConnection.Error += ex => Console.WriteLine("SignalR error: {0}", ex.Message);

メソッドの呼び出しからエラーを処理するには、try-catch ブロックでコードをラップします。To handle errors from method invocations, wrap the code in a try-catch block.

try
{
    IEnumerable<Stock> stocks = await stockTickerHub.Invoke<IEnumerable<Stock>>("GetAllStocks");
    foreach (Stock stock in stocks)
    {
        Console.WriteLine("Symbol: {0} price: {1}", stock.Symbol, stock.Price);
    }
}
catch (Exception ex)
{
    Console.WriteLine("Error invoking GetAllStocks: {0}", ex.Message);
}

クライアント側のログ記録を有効にする方法How to enable client-side logging

クライアント側のログ記録を有効にするには設定、TraceLevelTraceWriter接続オブジェクトのプロパティ。To enable client-side logging, set the TraceLevel and TraceWriter properties on the connection object.

var hubConnection = new HubConnection("http://www.contoso.com/");
hubConnection.TraceLevel = TraceLevels.All;
hubConnection.TraceWriter = Console.Out;
IHubProxy stockTickerHubProxy = hubConnection.CreateHubProxy("StockTickerHub");
stockTickerHubProxy.On<Stock>("UpdateStockPrice", stock => Console.WriteLine("Stock update for {0} new price {1}", stock.Symbol, stock.Price));
await hubConnection.Start();

WPF、Silverlight、およびコンソール アプリケーションのコード サンプル、サーバーが呼び出すことができるクライアント メソッドWPF, Silverlight, and console application code samples for client methods that the server can call

サーバーが呼び出すことができるクライアント メソッドを定義する前に示したコード サンプルは、WinRT クライアントに適用されます。The code samples shown earlier for defining client methods that the server can call apply to WinRT clients. 次のサンプルでは、WPF、Silverlight、およびコンソール アプリケーションのクライアントの同等のコードを表示します。The following samples show the equivalent code for WPF, Silverlight, and console application clients.

パラメーターなしのメソッドMethods without parameters

パラメーターなしのサーバーから呼び出されるメソッドの WPF クライアント コードWPF client code for method called from server without parameters

stockTickerHub.On<Stock>("notify", () =>
    Dispatcher.InvokeAsync(() =>
        {
            SignalRTextBlock.Text += string.Format("Notified!");
        })
);

パラメーターなしのサーバーから呼び出されるメソッドの Silverlight クライアント コードSilverlight client code for method called from server without parameters

stockTickerHub.On<Stock>("notify", () =>
    // Context is a reference to SynchronizationContext.Current
    Context.Post(delegate
    {
        textBox.Text += "Notified!";
    }, null)
);

メソッドのコンソール アプリケーションのクライアント コードは、パラメーターなしのサーバーから呼び出されますConsole application client code for method called from server without parameters

stockTickerHubProxyProxy.On("Notify", () => Console.WriteLine("Notified!"));

パラメーターの型を指定するパラメーターを持つメソッドMethods with parameters, specifying the parameter types

パラメーターを持つサーバーから呼び出されるメソッドの WPF クライアント コードWPF client code for a method called from server with a parameter

stockTickerHubProxy.On<Stock>("UpdateStockPrice", stock => 
    Dispatcher.InvokeAsync(() =>
        {
            textBox.Text += string.Format("Stock update for {0} new price {1}\n", stock.Symbol, stock.Price);
        })
);

パラメーターを持つサーバーから呼び出されるメソッドの Silverlight クライアント コードSilverlight client code for a method called from server with a parameter

stockTickerHubProxy.On<Stock>("UpdateStockPrice", stock => 
    // Context is a reference to SynchronizationContext.Current
    Context.Post(delegate
    {
        textBox.Text += string.Format("Stock update for {0} new price {1}\n", stock.Symbol, stock.Price);
    }, null)
);

パラメーターを持つサーバーからメソッドのコンソール アプリケーションのクライアント コードが呼び出されますConsole application client code for a method called from server with a parameter

stockTickerHubProxy.On<Stock>("UpdateStockPrice", stock => 
    Console.WriteLine("Symbol {0} Price {1}", stock.Symbol, stock.Price));

パラメーターの動的オブジェクトを指定するパラメーターを持つメソッドMethods with parameters, specifying dynamic objects for the parameters

パラメーターの動的オブジェクトを使用して、パラメーターを持つサーバーから呼び出されるメソッドの WPF クライアント コードWPF client code for a method called from server with a parameter, using a dynamic object for the parameter

stockTickerHubProxy.On("UpdateStockPrice", stock => 
    Dispatcher.InvokeAsync(() =>
        {
            textBox.Text += string.Format("Stock update for {0} new price {1}\n", stock.Symbol, stock.Price);
        })
);

パラメーターの動的オブジェクトを使用して、パラメーターを持つサーバーから呼び出されるメソッドの Silverlight クライアント コードSilverlight client code for a method called from server with a parameter, using a dynamic object for the parameter

stockTickerHubProxy.On("UpdateStockPrice", stock => 
    // Context is a reference to SynchronizationContext.Current
    Context.Post(delegate
    {
        textBox.Text += string.Format("Stock update for {0} new price {1}\n", stock.Symbol, stock.Price);
    }, null)
);

パラメーターの動的オブジェクトを使用して、パラメーターを持つサーバーからメソッドのコンソール アプリケーションのクライアント コードが呼び出されますConsole application client code for a method called from server with a parameter, using a dynamic object for the parameter

stockTickerHubProxy.On("UpdateStockPrice", stock => 
    Console.WriteLine("Symbol {0} Price {1}", stock.Symbol, stock.Price));