Skip to content

Amazon.Lambda.AspNetCoreServer.Hosting: Response size logging (middleware) doesn't work in Lambda, but works from CLI #2040

Open
@kjpgit

Description

@kjpgit

Describe the bug

Not sure if this a bug or feature request, but how can I log all response sizes?

We currently use serilog request logging middleware: https://github.com/serilog/serilog-aspnetcore?tab=readme-ov-file#request-logging

And for our asp.net code that runs in fargate, this has worked fine to capture the response size, and ensure it gets saved for serilog:

public class MySizeLoggingMiddleware
{
    private readonly RequestDelegate _next;
    private readonly Serilog.IDiagnosticContext diagnosticContext;

    public MySizeLoggingMiddleware(RequestDelegate next, Serilog.IDiagnosticContext diagnosticContext)
    {
        _next = next;
        this.diagnosticContext = diagnosticContext;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        if (context.Response.HasStarted) {
            throw new Exception("Cannot buffer response, it has already started");
        }

        var originalStream = context.Response.Body;
        using var bufferedStream = new MemoryStream();
        context.Response.Body = bufferedStream;

        try {
            await _next(context);
        } catch (Exception) {
            Log.Warning("Exception was thrown, resetting body (developer exception page might write to it)");
            context.Response.Body = originalStream;
            throw;
        }

        // Get the buffered content size, and save it for serilog request logging
        long contentSize = bufferedStream.Length;
        diagnosticContext.Set("ResponseSize", contentSize);

        context.Response.Body = originalStream;
        bufferedStream.Seek(0, SeekOrigin.Begin);
        await bufferedStream.CopyToAsync(originalStream);
    }
}

However when using Amazon.Lambda.AspNetCoreServer.Hosting, inside Lambda, the size is always reported & logged as 0, meaning nothing is actually writing to the memory stream I'm creating. The same codebase works fine when run using dotnet run.

Regression Issue

  • Select this option if this issue appears to be a regression.

Expected Behavior

.

Current Behavior

.

Reproduction Steps

.

Possible Solution

No response

Additional Information/Context

No response

AWS .NET SDK and/or Package version used

Amazon.Lambda.AspNetCoreServer.Hosting

Targeted .NET Platform

.net 8

Operating System and version

lambda

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugThis issue is a bug.p2This is a standard priority issuequeued

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions