簡體   English   中英

在 ASP.Net Core 中壓縮之前記錄響應正文

[英]Logging response body BEFORE compression in ASP.Net Core

我有一件看似簡單的事情需要做; 在控制器完全形成響應體之后,但在應用壓縮之前,記錄來自中間件的響應體。

這里的問題是我只能在等待來自日志記錄中間件的 next() 之后讀取響應,這也壓縮了響應正文。

我的日志實現基於這篇文章; https://elanderson.net/2019/12/log-requests-and-responses-in-asp-net-core-3/?unapproved=220252&moderation-hash=337bbb1489547696340e7506459779ba#comment-220252

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
...
    app.UseMiddleware<RequestResponseLoggingMiddleware>();

    app.UseRouting();

    //compression
    app.UseResponseCompression();

    app.UseAuthentication();
    app.UseAuthorization();

    app.UseEndpoints(endpoints => {
        endpoints.MapControllers();
    });

    ConfigurePSTZone();
...
}

RequestResponseLoggingMiddleware 中間件;

    var originalBodyStream = context.Response.Body;
    await using var responseBody = _recyclableMemoryStreamManager.GetStream();
    context.Response.Body = responseBody;
    await _next(context); 
    context.Response.Body.Seek(0, SeekOrigin.Begin);
    var responseBody = await new StreamReader(context.Response.Body).ReadToEndAsync();

如果你調用await _next(context); 然后 responseBody 將填充壓縮后的響應。 如果你不調用它, responseBody 將為空。 即使你移動了UseMiddleware(); 到配置的最后。

不確定當前在 .Net 5 中實際上是否有解決方案,但嘿,也許有人已經想通了。

謝謝

補充說明:這似乎只是在使用帶有 kestrel(基於 linux)的 Asp.Net 時出現問題。 在 Windows 上你不需要響應壓縮中間件..所以我想沒有多少人已經切換到 Linux 這就是為什么之前沒有人問過這個問題。 吉普車

中間件按順序執行( 鏈接)。
你可以移動app.UseMiddleware<RequestResponseLoggingMiddleware>(); app.UseResponseCompression();之后調用app.UseResponseCompression();

我在使用 .net 核心內置 ResponseCompression 時遇到了同樣的問題,但能夠使用來自CompressionMiddleware.cs的靈感來創建自定義壓縮中間件

並且在Startup.cs中配置如下

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IServiceProvider serviceProvider)
    {
        app.UseCompression();
        
        app.UseMiddleware<RequestResponseLogger>();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM