Open
Description
Is there an existing issue for this?
- I have searched the existing issues
Describe the bug
The HttpLoggingMiddleware
logs empty request/response bodies in case the subsequent middleware closes the corresponding stream. For example, CoreWCF
does that for the BasicHttpBinding
.
info: Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware[3]
RequestBody: [Only partially consumed by app]
info: Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware[4]
ResponseBody:
Expected Behavior
Request and Response bodies are being logged whether the stream has been closed or not.
Steps To Reproduce
- Create an empty Web application
- Change
Logging:LogLevel:Microsoft.AspNetCore
toInformation
inappsettings*.json
- Put the following code in the
Program.cs
using Microsoft.AspNetCore.HttpLogging;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddHttpLogging(options => options.LoggingFields = HttpLoggingFields.All);
var app = builder.Build();
app.UseHttpLogging();
app.Run(async context =>
{
var buffer = new byte[context.Request.ContentLength!.Value];
await context.Request.Body.ReadExactlyAsync(buffer, 0, buffer.Length);
context.Request.Body.Close(); // (1) Close the request body stream
context.Response.ContentType = "text/plain";
await context.Response.Body.WriteAsync(buffer);
context.Response.Body.Close(); // (2) Close the response body stream
});
await app.StartAsync();
var httpClient = new HttpClient();
httpClient.BaseAddress = new Uri(app.Urls.First());
var response = await httpClient.PostAsync("/", new StringContent("LOOK FOR THIS IN THE LOGS"));
app.Logger.LogInformation("Response received: {response}, body: {body}", response, response.Content.ReadAsStringAsync().GetAwaiter().GetResult());
await app.StopAsync();
- Run the app
- Observe that
HttpLoggingMiddleware
doesn't log neither Request nor Response bodies:
info: Microsoft.Hosting.Lifetime[14]
Now listening on: http://localhost:5082
info: Microsoft.Hosting.Lifetime[0]
Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
Content root path: D:\immediate\WebApplication2
info: Microsoft.AspNetCore.Hosting.Diagnostics[1]
Request starting HTTP/1.1 POST http://localhost:5082/ - text/plain;+charset=utf-8 25
info: Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware[1]
Request:
Protocol: HTTP/1.1
Method: POST
Scheme: http
PathBase:
Path: /
Host: localhost:5082
Content-Type: text/plain; charset=utf-8
Content-Length: 25
info: Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware[2]
Response:
StatusCode: 200
Content-Type: text/plain
info: Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware[3]
RequestBody: [Only partially consumed by app]
info: Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware[4]
ResponseBody:
info: Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware[8]
Duration: 11.3532ms
info: Microsoft.AspNetCore.Hosting.Diagnostics[2]
Request finished HTTP/1.1 POST http://localhost:5082/ - 200 - text/plain 22.4930ms
info: WebApplication2[0]
Response received: StatusCode: 200, ReasonPhrase: 'OK', Version: 1.1, Content: System.Net.Http.HttpConnectionResponseContent, Headers:
{
Date: Mon, 14 Apr 2025 13:28:05 GMT
Server: Kestrel
Transfer-Encoding: chunked
Content-Type: text/plain
}, body: LOOK FOR THIS IN THE LOGS
info: Microsoft.Hosting.Lifetime[0]
Application is shutting down...
Process finished with exit code 0.
Exceptions (if any)
No response
.NET Version
10.0.100-preview.4.25207.10
Anything else?
No response