Skip to content

HttpLogging drops Request/Response bodies if Stream has been closed #61489

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
1 task done
ExtraClock opened this issue Apr 14, 2025 · 0 comments · May be fixed by #61490
Open
1 task done

HttpLogging drops Request/Response bodies if Stream has been closed #61489

ExtraClock opened this issue Apr 14, 2025 · 0 comments · May be fixed by #61490
Labels
area-networking Includes servers, yarp, json patch, bedrock, websockets, http client factory, and http abstractions

Comments

@ExtraClock
Copy link

ExtraClock commented Apr 14, 2025

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

  1. Create an empty Web application
  2. Change Logging:LogLevel:Microsoft.AspNetCore to Information in appsettings*.json
  3. 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();
  1. Run the app
  2. 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

@dotnet-issue-labeler dotnet-issue-labeler bot added the area-networking Includes servers, yarp, json patch, bedrock, websockets, http client factory, and http abstractions label Apr 14, 2025
ExtraClock added a commit to ExtraClock/aspnetcore that referenced this issue Apr 14, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area-networking Includes servers, yarp, json patch, bedrock, websockets, http client factory, and http abstractions
Projects
None yet
1 participant