我正在使用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+
HubConnection
有State
属性。
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();
}