ASP.NET Core SignalR .NET クライアントASP.NET Core SignalR .NET Client

ASP.NET Core SignalR .NET クライアント ライブラリでは、.NET アプリからの SignalR ハブと通信できます。The ASP.NET Core SignalR .NET client library lets you communicate with SignalR hubs from .NET apps.

注意

Xamarin には、Visual Studio バージョンについての特別な要件があります。Xamarin has special requirements for Visual Studio version. 詳細については、次を参照してください。 Xamarin で SignalR クライアント 2.1.1します。For more information, see SignalR Client 2.1.1 in Xamarin.

サンプル コードを表示またはダウンロードします (ダウンロード方法)。View or download sample code (how to download)

この記事のサンプル コードは、ASP.NET Core SignalR .NET クライアントを使用する WPF アプリです。The code sample in this article is a WPF app that uses the ASP.NET Core SignalR .NET client.

SignalR .NET クライアント パッケージをインストールします。Install the SignalR .NET client package

Microsoft.AspNetCore.SignalR.Client SignalR ハブに接続するための .NET クライアント パッケージが必要です。The Microsoft.AspNetCore.SignalR.Client package is needed for .NET clients to connect to SignalR hubs. クライアント ライブラリをインストールする、次のコマンドを実行、パッケージ マネージャー コンソールウィンドウ。To install the client library, run the following command in the Package Manager Console window:

Install-Package Microsoft.AspNetCore.SignalR.Client

ハブへの接続します。Connect to a hub

接続を確立するには、作成、HubConnectionBuilderを呼び出すとBuildします。To establish a connection, create a HubConnectionBuilder and call Build. 接続の作成中には、ハブの URL、プロトコル、トランスポートの種類、ログ レベル、ヘッダー、およびその他のオプションを構成できます。The hub URL, protocol, transport type, log level, headers, and other options can be configured while building a connection. 挿入することで、必要なオプションを構成、HubConnectionBuilderメソッドにBuildします。Configure any required options by inserting any of the HubConnectionBuilder methods into Build. 接続を開始StartAsyncします。Start the connection with StartAsync.

using System;
using System.Threading.Tasks;
using System.Windows;
using Microsoft.AspNetCore.SignalR.Client;

namespace SignalRChatClient
{
    public partial class MainWindow : Window
    {
        HubConnection connection;
        public MainWindow()
        {
            InitializeComponent();

            connection = new HubConnectionBuilder()
                .WithUrl("http://localhost:53353/ChatHub")
                .Build();

            connection.Closed += async (error) =>
            {
                await Task.Delay(new Random().Next(0,5) * 1000);
                await connection.StartAsync();
            };
        }

        private async void connectButton_Click(object sender, RoutedEventArgs e)
        {
            connection.On<string, string>("ReceiveMessage", (user, message) =>
            {
                this.Dispatcher.Invoke(() =>
                {
                   var newMessage = $"{user}: {message}";
                   messagesList.Items.Add(newMessage);
                });
            });

            try
            {
                await connection.StartAsync();
                messagesList.Items.Add("Connection started");
                connectButton.IsEnabled = false;
                sendButton.IsEnabled = true;
            }
            catch (Exception ex)
            {
                messagesList.Items.Add(ex.Message);
            }
        }

        private async void sendButton_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                await connection.InvokeAsync("SendMessage", 
                    userTextBox.Text, messageTextBox.Text);
            }
            catch (Exception ex)
            {                
                messagesList.Items.Add(ex.Message);                
            }
        }
    }
}

接続が失われたハンドルHandle lost connection

使用して、Closed失われた接続に応答するイベントです。Use the Closed event to respond to a lost connection. たとえば、再接続を自動化することがあります。For example, you might want to automate reconnection.

Closedイベントを返すデリゲートが必要です、 Task、非同期コードを使用せずに実行することができますasync voidします。The Closed event requires a delegate that returns a Task, which allows async code to run without using async void. デリゲートのシグネチャを満たすために、Closedイベント ハンドラーの実行を同期的に、返すTask.CompletedTask:To satisfy the delegate signature in a Closed event handler that runs synchronously, return Task.CompletedTask:

connection.Closed += (error) => {
    // Do your close logic.
    return Task.CompletedTask;
};

非同期サポートの主な理由とは、接続を再起動するためです。The main reason for the async support is so you can restart the connection. 非同期アクションは、接続を開始します。Starting a connection is an async action.

Closedハンドラー、接続の再起動時は、次の例に示すように、サーバーのオーバー ロードを防ぐためにランダムな時間の待機を検討してください。In a Closed handler that restarts the connection, consider waiting for some random delay to prevent overloading the server, as shown in the following example:

connection.Closed += async (error) =>
{
    await Task.Delay(new Random().Next(0,5) * 1000);
    await connection.StartAsync();
};

クライアントからのハブ メソッドの呼び出しCall hub methods from client

InvokeAsync ハブのメソッドを呼び出します。InvokeAsync calls methods on the hub. ハブ メソッドの名前およびハブ メソッドで定義されている引数を渡すInvokeAsyncします。Pass the hub method name and any arguments defined in the hub method to InvokeAsync. SignalR が非同期でこれを使用して、asyncawait呼び出しを行うときにします。SignalR is asynchronous, so use async and await when making the calls.

await connection.InvokeAsync("SendMessage", 
    userTextBox.Text, messageTextBox.Text);

注意

Azure SignalR サービスを使用している場合サーバーレス モード、クライアントからハブ メソッドを呼び出すことはできません。If you're using Azure SignalR Service in Serverless mode, you cannot call hub methods from a client. 詳細については、次を参照してください。、 SignalR サービスのドキュメントします。For more information, see the SignalR Service documentation.

ハブからのクライアント メソッドを呼び出すCall client methods from hub

ハブ呼び出しを使用してメソッドを一切定義connection.Onしますが、接続を開始する前に、ビルド後にします。Define methods the hub calls using connection.On after building, but before starting the connection.

connection.On<string, string>("ReceiveMessage", (user, message) =>
{
    this.Dispatcher.Invoke(() =>
    {
       var newMessage = $"{user}: {message}";
       messagesList.Items.Add(newMessage);
    });
});

上記のコードでconnection.Onを使用してサーバー側コードから呼び出すときに実行される、SendAsyncメソッド。The preceding code in connection.On runs when server-side code calls it using the SendAsync method.

public async Task SendMessage(string user, string message)
{
    await Clients.All.SendAsync("ReceiveMessage", user,message);
}

エラー処理とログ記録Error handling and logging

Try-catch ステートメントでエラーを処理します。Handle errors with a try-catch statement. 検査、Exceptionエラーが発生した後に実行する適切なアクションを決定するオブジェクト。Inspect the Exception object to determine the proper action to take after an error occurs.

try
{
    await connection.InvokeAsync("SendMessage", 
        userTextBox.Text, messageTextBox.Text);
}
catch (Exception ex)
{                
    messagesList.Items.Add(ex.Message);                
}

その他の技術情報Additional resources