-
Notifications
You must be signed in to change notification settings - Fork 10.4k
Closed
Labels
area-networkingIncludes servers, yarp, json patch, bedrock, websockets, http client factory, and http abstractionsIncludes servers, yarp, json patch, bedrock, websockets, http client factory, and http abstractions
Milestone
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
Metadata
Metadata
Assignees
Labels
area-networkingIncludes servers, yarp, json patch, bedrock, websockets, http client factory, and http abstractionsIncludes servers, yarp, json patch, bedrock, websockets, http client factory, and http abstractions