无法从 .Net5 中的服务器读取 Response.Body

Can not read Response.Body from server in .Net5

我跟踪request/response登录Api网关.Net5的中间件,我可以读取Request.Body,但是我不明白body的响应,显示如下

 `�      <�_O�0G��r_����%>�"A�8��[��Im���
�w7n��{rO��/�կZ~y����36������rNIJ��d�w��\�'�����|w-�!�OR#Q�fi�X��   G��Sg�`��X@��{��KE�k�T3Zj%5N�@���+��SY��[�׊C(w� �·��@"�E���UnM�}��Jc�k�����F����#��$q�O(�.tÃ�c�ӕW����  �� ID�P`

这里分享一下我读到的回复码

              string responseBody = string.Empty;
                var originalBodyStream = context?.Response.Body;

                //Create a new memory stream...
                using (var responseStream = new MemoryStream())
                {
                        context.Response.Body = responseStream;
                        await _next.Invoke(context);
                        context.Response.Body.Seek(0, SeekOrigin.Begin);
                        responseBody = new StreamReader(context.Response.Body).ReadToEnd();
                        context.Response.Body.Seek(0, SeekOrigin.Begin);
                        await responseStream.CopyToAsync(originalBodyStream);
                }

这是我的要求header

{
    "Accept":"application/json, text/plain, */*",
    "Accept-Encoding":"gzip",
    "Accept-Language":"en-GB,en-US;q=0.9,en;q=0.8",
    "Connection":"Keep-Alive",
    "Content-Length":"2",
    "Content-Type":"application/json;charset=UTF-8",
   }

我可以使用 SharpZipLib 包阅读, 这段代码对我有用

            GZipInputStream unGzipStream = new GZipInputStream(response.Body);
            var responseBodytxt = new StreamReader(unGzipStream).ReadToEnd();
            response.Body.Seek(0, SeekOrigin.Begin);

您不必编写自己的响应日志记录代码。 ASP.NET Core 已经支持 HTTP Logging。它也支持使用多种算法进行响应压缩,包括 SharpZipLib 不支持的 Brotli。

To enable logging 只需要调用 app.UseHttpLogging():

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseHttpLogging();
...

请求和响应将被记录为来自 Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware 源的 Information 消息。可以通过代码或配置设置使用日志记录配置来配置这些消息的目的地。

ASP.NET Core 没有内置文件提供程序。最常见的选项之一是使用 Serilog,它可以配置为将来自不同来源的消息记录到不同的文件:

    public static int Main(string[] args)
    {
        Log.Logger = new LoggerConfiguration()
            .MinimumLevel.Override("Microsoft", LogEventLevel.Information)
            .Enrich.FromLogContext()
            .WriteTo.Console()
            .WriteTo.File("log.txt")
            .CreateLogger();
...

并在 CreateHostBuilder() 中:

public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .UseSerilog() // <-- Add this line
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });

ASP.NET 核心 Serilog 集成还包括 Request logging

通过将参数传递给 File,可以按日志级别记录到不同的文件,例如:

        .WriteTo.Console()
        .WriteTo.File("log.txt",LogEventLevel.Information)
        .WriteTo.File("errors.txt",LogEventLevel.Error)

可以使用 sub-loggers:

配置记录到不同的接收器
.WriteTo.Logger(lc => lc
    .Filter.ByIncludingOnly(Matching.FromSource<Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware>())
    .WriteTo.File("http.txt"))