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

Open
#2,040 1 comment 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Assessment

Difficulty
4/5
Estimated time
3-5 days
Newbie friendliness
30/100
Issue type
Bug
Clarity
Needs clarification
Activity status
Stale
Tech stack
aws, csharp
Domain
backend, cloud

Research direction

Reproduce the response-size logging middleware with Amazon.Lambda.AspNetCoreServer.Hosting on .NET 8 in Lambda, then compare its response-body handling with the same code under dotnet run. Done means the middleware captures a nonzero response size and Serilog logs it in Lambda as well.

Written by the indexing model from the issue text.

Description

bug p2 queued
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

Dominant language
C#
Stars
1.7k
Forks
503
Avg merge
1d 18h
Merged PRs (30d)
21

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from aws/aws-lambda-dotnet

All issues in aws/aws-lambda-dotnet

Similar issues

More C# issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.