[英]Logging response body BEFORE compression in ASP.Net Core
我有一件看似簡單的事情需要做; 在控制器完全形成響應體之后,但在應用壓縮之前,記錄來自中間件的響應體。
這里的問題是我只能在等待來自日志記錄中間件的 next() 之后讀取響應,這也壓縮了響應正文。
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.