Expose ConnectionId on .NET Client (#8668)
This commit is contained in:
parent
63a4b5c27a
commit
017f409fe4
|
|
@ -26,6 +26,7 @@ namespace Microsoft.AspNetCore.SignalR.Client
|
||||||
public static readonly System.TimeSpan DefaultServerTimeout;
|
public static readonly System.TimeSpan DefaultServerTimeout;
|
||||||
public HubConnection(Microsoft.AspNetCore.SignalR.Client.IConnectionFactory connectionFactory, Microsoft.AspNetCore.SignalR.Protocol.IHubProtocol protocol, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) { }
|
public HubConnection(Microsoft.AspNetCore.SignalR.Client.IConnectionFactory connectionFactory, Microsoft.AspNetCore.SignalR.Protocol.IHubProtocol protocol, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) { }
|
||||||
public HubConnection(Microsoft.AspNetCore.SignalR.Client.IConnectionFactory connectionFactory, Microsoft.AspNetCore.SignalR.Protocol.IHubProtocol protocol, System.IServiceProvider serviceProvider, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) { }
|
public HubConnection(Microsoft.AspNetCore.SignalR.Client.IConnectionFactory connectionFactory, Microsoft.AspNetCore.SignalR.Protocol.IHubProtocol protocol, System.IServiceProvider serviceProvider, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) { }
|
||||||
|
public string ConnectionId { get { throw null; } }
|
||||||
public System.TimeSpan HandshakeTimeout { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
public System.TimeSpan HandshakeTimeout { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
||||||
public System.TimeSpan KeepAliveInterval { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
public System.TimeSpan KeepAliveInterval { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
||||||
public System.TimeSpan ServerTimeout { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
public System.TimeSpan ServerTimeout { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
||||||
|
|
|
||||||
|
|
@ -54,6 +54,7 @@ namespace Microsoft.AspNetCore.SignalR.Client
|
||||||
private long _nextActivationSendPing;
|
private long _nextActivationSendPing;
|
||||||
private bool _disposed;
|
private bool _disposed;
|
||||||
private bool _hasInherentKeepAlive;
|
private bool _hasInherentKeepAlive;
|
||||||
|
private string _connectionId;
|
||||||
|
|
||||||
private CancellationToken _uploadStreamToken;
|
private CancellationToken _uploadStreamToken;
|
||||||
|
|
||||||
|
|
@ -123,6 +124,13 @@ namespace Microsoft.AspNetCore.SignalR.Client
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public TimeSpan HandshakeTimeout { get; set; } = DefaultHandshakeTimeout;
|
public TimeSpan HandshakeTimeout { get; set; } = DefaultHandshakeTimeout;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the connection's current Id. This value will be cleared when the connection is stopped and will have a new value every time the connection is (re)established.
|
||||||
|
/// This value will be null if the negotiation step is skipped via HttpConnectionOptions or if the WebSockets transport is explicitly specified because the
|
||||||
|
/// client skips negotiation in that case as well.
|
||||||
|
/// </summary>
|
||||||
|
public string ConnectionId => _connectionId;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates the state of the <see cref="HubConnection"/> to the server.
|
/// Indicates the state of the <see cref="HubConnection"/> to the server.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
@ -345,6 +353,7 @@ namespace Microsoft.AspNetCore.SignalR.Client
|
||||||
|
|
||||||
// Start the connection
|
// Start the connection
|
||||||
var connection = await _connectionFactory.ConnectAsync(_protocol.TransferFormat);
|
var connection = await _connectionFactory.ConnectAsync(_protocol.TransferFormat);
|
||||||
|
_connectionId = connection.ConnectionId;
|
||||||
var startingConnectionState = new ConnectionState(connection, this);
|
var startingConnectionState = new ConnectionState(connection, this);
|
||||||
_hasInherentKeepAlive = connection.Features.Get<IConnectionInherentKeepAliveFeature>()?.HasInherentKeepAlive ?? false;
|
_hasInherentKeepAlive = connection.Features.Get<IConnectionInherentKeepAliveFeature>()?.HasInherentKeepAlive ?? false;
|
||||||
|
|
||||||
|
|
@ -412,6 +421,8 @@ namespace Microsoft.AspNetCore.SignalR.Client
|
||||||
(_serviceProvider as IDisposable)?.Dispose();
|
(_serviceProvider as IDisposable)?.Dispose();
|
||||||
_disposed = true;
|
_disposed = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_connectionId = null;
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -155,6 +155,41 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Theory]
|
||||||
|
[MemberData(nameof(HubProtocolsAndTransportsAndHubPaths))]
|
||||||
|
[LogLevel(LogLevel.Trace)]
|
||||||
|
public async Task CanAccessConnectionIdFromHubConnection(string protocolName, HttpTransportType transportType, string path)
|
||||||
|
{
|
||||||
|
var protocol = HubProtocols[protocolName];
|
||||||
|
using (StartServer<Startup>(out var server))
|
||||||
|
{
|
||||||
|
var connection = CreateHubConnection(server.Url, path, transportType, protocol, LoggerFactory);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Assert.Null(connection.ConnectionId);
|
||||||
|
await connection.StartAsync().OrTimeout();
|
||||||
|
var originalClientConnectionId = connection.ConnectionId;
|
||||||
|
var connectionIdFromServer = await connection.InvokeAsync<string>(nameof(TestHub.GetCallerConnectionId)).OrTimeout();
|
||||||
|
Assert.Equal(connection.ConnectionId, connectionIdFromServer);
|
||||||
|
await connection.StopAsync().OrTimeout();
|
||||||
|
Assert.Null(connection.ConnectionId);
|
||||||
|
await connection.StartAsync().OrTimeout();
|
||||||
|
connectionIdFromServer = await connection.InvokeAsync<string>(nameof(TestHub.GetCallerConnectionId)).OrTimeout();
|
||||||
|
Assert.NotEqual(originalClientConnectionId, connectionIdFromServer);
|
||||||
|
Assert.Equal(connection.ConnectionId, connectionIdFromServer);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
LoggerFactory.CreateLogger<HubConnectionTests>().LogError(ex, "{ExceptionType} from test", ex.GetType().FullName);
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
await connection.DisposeAsync().OrTimeout();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
[Theory]
|
[Theory]
|
||||||
[MemberData(nameof(HubProtocolsAndTransportsAndHubPaths))]
|
[MemberData(nameof(HubProtocolsAndTransportsAndHubPaths))]
|
||||||
[LogLevel(LogLevel.Trace)]
|
[LogLevel(LogLevel.Trace)]
|
||||||
|
|
|
||||||
|
|
@ -36,6 +36,11 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests
|
||||||
await Clients.Client(Context.ConnectionId).SendAsync("NoClientHandler");
|
await Clients.Client(Context.ConnectionId).SendAsync("NoClientHandler");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public string GetCallerConnectionId()
|
||||||
|
{
|
||||||
|
return Context.ConnectionId;
|
||||||
|
}
|
||||||
|
|
||||||
public ChannelReader<string> StreamEcho(ChannelReader<string> source) => TestHubMethodsImpl.StreamEcho(source);
|
public ChannelReader<string> StreamEcho(ChannelReader<string> source) => TestHubMethodsImpl.StreamEcho(source);
|
||||||
|
|
||||||
public string GetUserIdentifier()
|
public string GetUserIdentifier()
|
||||||
|
|
@ -110,6 +115,11 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests
|
||||||
await Clients.Client(Context.ConnectionId).NoClientHandler();
|
await Clients.Client(Context.ConnectionId).NoClientHandler();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public string GetCallerConnectionId()
|
||||||
|
{
|
||||||
|
return Context.ConnectionId;
|
||||||
|
}
|
||||||
|
|
||||||
public ChannelReader<string> StreamEcho(ChannelReader<string> source) => TestHubMethodsImpl.StreamEcho(source);
|
public ChannelReader<string> StreamEcho(ChannelReader<string> source) => TestHubMethodsImpl.StreamEcho(source);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -135,6 +145,11 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests
|
||||||
await Clients.Client(Context.ConnectionId).NoClientHandler();
|
await Clients.Client(Context.ConnectionId).NoClientHandler();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public string GetCallerConnectionId()
|
||||||
|
{
|
||||||
|
return Context.ConnectionId;
|
||||||
|
}
|
||||||
|
|
||||||
public ChannelReader<string> StreamEcho(ChannelReader<string> source) => TestHubMethodsImpl.StreamEcho(source);
|
public ChannelReader<string> StreamEcho(ChannelReader<string> source) => TestHubMethodsImpl.StreamEcho(source);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue