diff --git a/src/SignalR/clients/csharp/Client.Core/src/HubConnection.cs b/src/SignalR/clients/csharp/Client.Core/src/HubConnection.cs index ce525f204f..ee0059f6f8 100644 --- a/src/SignalR/clients/csharp/Client.Core/src/HubConnection.cs +++ b/src/SignalR/clients/csharp/Client.Core/src/HubConnection.cs @@ -63,13 +63,40 @@ namespace Microsoft.AspNetCore.SignalR.Client private ConnectionState _connectionState; private int _serverProtocolMinorVersion; + /// + /// Occurs when the connection is closed. The connection could be closed due to an error or due to either the server or client intentionally + /// closing the connection without error. + /// + /// + /// If this event was triggered from a connection error, the that occurred will be passed in as the + /// sole argument to this handler. If this event was triggered intentionally by either the client or server, then + /// the argument will be . + /// + /// + /// The following example attaches a handler to the event, and checks the provided argument to determine + /// if there was an error: + /// + /// + /// connection.Closed += (exception) => + /// { + /// if (exception == null) + /// { + /// Console.WriteLine("Connection closed without error."); + /// } + /// else + /// { + /// Console.WriteLine($"Connection closed due to an error: {exception.Message}"); + /// } + /// }; + /// + /// public event Func Closed; // internal for testing purposes internal TimeSpan TickRate { get; set; } = TimeSpan.FromSeconds(1); /// - /// Gets or sets the server timeout interval for the connection. + /// Gets or sets the server timeout interval for the connection. /// /// /// The client times out if it hasn't heard from the server for `this` long. @@ -510,7 +537,7 @@ namespace Microsoft.AspNetCore.SignalR.Client } } - // this is called via reflection using the `_sendStreamItems` field + // this is called via reflection using the `_sendStreamItems` field private async Task SendStreamItems(string streamId, ChannelReader reader, CancellationToken token) { Log.StartingStream(_logger, streamId); @@ -849,7 +876,7 @@ namespace Microsoft.AspNetCore.SignalR.Client } } } - + // shutdown if we're unable to read handshake // Ignore HubException because we throw it when we receive a handshake response with an error // And because we already have the error, we don't need to log that the handshake failed @@ -1139,7 +1166,7 @@ namespace Microsoft.AspNetCore.SignalR.Client private class InvocationHandlerList { private readonly List _invocationHandlers; - // A lazy cached copy of the handlers that doesn't change for thread safety. + // A lazy cached copy of the handlers that doesn't change for thread safety. // Adding or removing a handler sets this to null. private InvocationHandler[] _copiedHandlers; diff --git a/src/SignalR/common/Http.Connections/src/HttpConnectionContextExtensions.cs b/src/SignalR/common/Http.Connections/src/HttpConnectionContextExtensions.cs index 9c22c75834..b2f8a10cd1 100644 --- a/src/SignalR/common/Http.Connections/src/HttpConnectionContextExtensions.cs +++ b/src/SignalR/common/Http.Connections/src/HttpConnectionContextExtensions.cs @@ -9,6 +9,15 @@ namespace Microsoft.AspNetCore.Http.Connections { public static class HttpConnectionContextExtensions { + /// + /// Gets the associated with the connection, if there is one. + /// + /// The representing the connection. + /// The associated with the connection, or if the connection is not HTTP-based. + /// + /// SignalR connections can run on top of HTTP transports like WebSockets or Long Polling, or other non-HTTP transports. As a result, + /// this method can sometimes return depending on the configuration of your application. + /// public static HttpContext GetHttpContext(this ConnectionContext connection) { return connection.Features.Get()?.HttpContext; diff --git a/src/SignalR/common/SignalR.Common/src/HubException.cs b/src/SignalR/common/SignalR.Common/src/HubException.cs index cb87c50c10..569437573c 100644 --- a/src/SignalR/common/SignalR.Common/src/HubException.cs +++ b/src/SignalR/common/SignalR.Common/src/HubException.cs @@ -9,6 +9,10 @@ namespace Microsoft.AspNetCore.SignalR /// /// The exception thrown from a hub when an error occurs. /// + /// + /// Exceptions often contain sensitive information, such as connection information. Because of this, SignalR does not expose the details + /// of exceptions that occur on the server to the client. However, instances of are sent to the client. + /// [Serializable] public class HubException : Exception { diff --git a/src/SignalR/server/Core/src/HubConnectionContext.cs b/src/SignalR/server/Core/src/HubConnectionContext.cs index 895a673184..86b735cd35 100644 --- a/src/SignalR/server/Core/src/HubConnectionContext.cs +++ b/src/SignalR/server/Core/src/HubConnectionContext.cs @@ -19,6 +19,9 @@ using Microsoft.Extensions.Logging; namespace Microsoft.AspNetCore.SignalR { + /// + /// Encapsulates all information about an individual connection to a SignalR Hub. + /// public class HubConnectionContext { private static readonly Action _cancelReader = state => ((PipeReader)state).CancelPendingRead();