SignalR Core - 从 WebAPI 检查连接状态



我正在使用Microsoft.AspNetCore.SignalR.Client从我的 WebAPI 项目打开连接,以便在我的 SignalR 中心项目中连接和调用方法。这些是托管在不同服务器上的单独项目。

如何检查连接是否已启动,因此我不会尝试启动两次?

我使用以下代码从 WebAPI 连接:

public class ChatApi
{
    private readonly HubConnection _connection;
    public ChatApi()
    {
        var connection = new HubConnectionBuilder();
        _connection = connection.WithUrl("https://localhost:44302/chathub").Build();
    }
    public async Task SendMessage(Msg model)
    {
        await _connection.StartAsync();
        await _connection.SendAsync("Send", model);
    }
}

由于我的 WebAPI 将经常调用 SignalR,因此我想在 WebAPI 和 SignalR 之间创建单个连接,而不是每次都关闭/打开连接。目前,我将ChatApi类创建为单例,并在构造函数中初始化集线器连接。

在调用await _connection.StartAsync();之前,我将如何检查连接是否已启动?

使用:Microsoft.AspNetCore.SignalR.Client v1.0.0-预览1-最终

Microsoft.AspNetCore.SignalR.Client v1.1.0+

HubConnectionState属性。

public class ChatApi
{
    private readonly HubConnection _connection;
    public ChatApi()
    {
        _connection = new HubConnectionBuilder()
            .WithUrl("https://localhost:44302/chathub")
            .Build();
    }
    public async Task StartIfNeededAsync()
    {
        if (_connection.State == HubConnectionState.Disconnected)
        {
            await _connection.StartAsync();
        }
    }
    public async Task SendMessage(Msg model)
    {
        await StartIfNeededAsync();
        await _connection.SendAsync("Send", model);
    }
}

引用:

  • https://learn.microsoft.com/en-us/aspnet/core/signalr/dotnet-client
  • aspnet/SignalR/pull/2204
  • dotnet/aspnetcore@7625bbc

Microsoft.AspNetCore.SignalR.Client

(在撰写本文时,最新版本是 1.0.0-preview2-final。

没有ConnectionState财产。

您需要通过订阅 HubConnection 上的 Closed 事件来自己跟踪状态。

public class ChatApi
{
    private readonly HubConnection _connection;
    private ConnectionState _connectionState = ConnectionState.Disconnected;
    public ChatApi()
    {
        var connection = new HubConnectionBuilder();
        _connection = connection.WithUrl("https://localhost:44302/chathub").Build();
        // Subscribe to event
        _connection.Closed += (ex) =>
        {
            if (ex == null)
            {
                Trace.WriteLine("Connection terminated");
                _connectionState = ConnectionState.Disconnected;
            }
            else
            {
                Trace.WriteLine($"Connection terminated with error: {ex.GetType()}: {ex.Message}");
                _connectionState = ConnectionState.Faulted;
            }
        };
    }
    public async Task StartIfNeededAsync()
    {
        if (_connectionState == ConnectionState.Connected)
        {
            return;
        }
        try
        {
            await _connection.StartAsync();
            _connectionState = ConnectionState.Connected;
        }
        catch (Exception ex)
        {
            Trace.WriteLine($"Connection.Start Failed: {ex.GetType()}: {ex.Message}");
            _connectionState = ConnectionState.Faulted;
            throw;
        }
    }
    private enum ConnectionState
    {
        Connected,
        Disconnected,
        Faulted
    }
}

用法:

public async Task SendMessage(Msg model)
{
    await StartIfNeededAsync();
    await _connection.SendAsync("Send", model);
}

引用:

  • aspnet/SignalR/blob/1fc282a/benchmarkapps/Crankier/Client.cs
  • aspnet/SignalR/issues/2127(在此答案后8天打开(

至少在 .NET Core 2.1 中,您可以检查 HubConnection 的 State 属性:

if (_connection.State == HubConnectionState.Disconnected) {
        await _connection.StartAsync();
}

最新更新