'Log HttpContext.Response.Headers on OnActionExecuted in .NET 6

I'm trying to create an attribute [LogRequest] which will log HTTP request and response with headers.

Action controller

[HttpGet]
[Route("GetCourse")]
[LogRequest]
public Course GetCourse()
{
    return new Course();
}

Implementation of LogRequest attribute

public class LogRequest : TypeFilterAttribute
{
    public LogRequest() : base(typeof(LogRequestImplementation)) { }

    private class LogRequestImplementation : IActionFilter
    {
        //Log request
        public void OnActionExecuting(ActionExecutingContext context)
        {
            //Here i'm logging request. This part works perfectly
        }

        //Log response
        public void OnActionExecuted(ActionExecutedContext context)
        {
            IHeaderDictionary responseHeaders = context.HttpContext.Response.Headers;
            //responseHeaders is always empty.
        }
    }
} 

context.HttpContext.Response.Headers is always empty. I guess i'm missing something in middleware.

Program.cs

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
}

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.Use(async (context, next) =>
{
    context.Request.EnableBuffering();
    await next();
});

app.Run();


Solution 1:[1]

You have to inherit from 'ActionFilterAttribute'

public class LogRequestImplementation : ActionFilterAttribute

To log an request data you can use 'IActionFilter' which will implement two methods.

  • OnActionExecuting
  • OnActionExecuted

And if you want to log response data you can use 'IResultFilter' which will implement

  • OnResultExecuting
  • OnResultExecuted

The Base ActionFilterAttribute Class

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Randy Marsh