Add ILoggerFactory to StreamableHttpServerTransport (#1213)

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: stephentoub <2642209+stephentoub@users.noreply.github.com>
Co-authored-by: Stephen Toub <stoub@microsoft.com>
This commit is contained in:
Copilot 2026-01-30 17:45:39 -05:00 • committed by GitHub
commit 5084a79068
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -1,3 +1,5 @@
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using ModelContextProtocol.Protocol;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
@ -21,7 +23,7 @@ namespace ModelContextProtocol.Server;
/// such as when streaming completion results or providing progress updates during long-running operations.
/// </para>
/// </remarks>
public sealed class StreamableHttpServerTransport : ITransport
public sealed partial class StreamableHttpServerTransport : ITransport
{
/// <summary>
/// The stream ID used for unsolicited messages sent via the standalone GET SSE stream.
@ -35,6 +37,7 @@ public sealed class StreamableHttpServerTransport : ITransport
});
private readonly CancellationTokenSource _transportDisposedCts = new();
private readonly SemaphoreSlim _unsolicitedMessageLock = new(1, 1);
private readonly ILogger _logger;
private SseEventWriter? _httpSseWriter;
private ISseEventStreamWriter? _storeSseWriter;
@ -42,6 +45,15 @@ public sealed class StreamableHttpServerTransport : ITransport
private bool _getHttpRequestStarted;
private bool _getHttpResponseCompleted;
/// <summary>
/// Initializes a new instance of the <see cref="StreamableHttpServerTransport"/> class.
/// </summary>
/// <param name="loggerFactory">Optional logger factory used for logging employed by the transport.</param>
public StreamableHttpServerTransport(ILoggerFactory? loggerFactory = null)
{
_logger = loggerFactory?.CreateLogger<StreamableHttpServerTransport>() ?? NullLogger<StreamableHttpServerTransport>.Instance;
}
/// <inheritdoc/>
public string? SessionId { get; init; }
@ -161,7 +173,7 @@ public sealed class StreamableHttpServerTransport : ITransport
Throw.IfNull(message);
Throw.IfNull(responseStream);
var postTransport = new StreamableHttpPostTransport(this, responseStream, _transportDisposedCts.Token);
var postTransport = new StreamableHttpPostTransport(this, responseStream, _transportDisposedCts.Token, _logger);
using var postCts = CancellationTokenSource.CreateLinkedTokenSource(_transportDisposedCts.Token, cancellationToken);
await using (postTransport.ConfigureAwait(false))
{