【问题标题】:c# dot net core action filter - How to read responsec# dot net core action filter - 如何读取响应
【发布时间】:2019-04-20 10:11:24
【问题描述】:

我有一个带有方法的动作过滤器:

public void OnActionExecuted(ActionExecutedContext context)
    {
        try
        {
            Stream originalBody = context.HttpContext.Response.Body;
            string responseBody = string.Empty;

            try
            {
                using (var memStream = new MemoryStream())
                {
                    context.HttpContext.Response.Body = memStream;

                    memStream.Position = 0;
                    responseBody = new StreamReader(memStream).ReadToEnd();

                    memStream.Position = 0;

                    memStream.CopyTo(originalBody);
                }

            }
            finally
            {
                context.HttpContext.Response.Body = originalBody;
            }

            _logger.LogDebug("OnActionExecuted, response=" + responseBody);

        }
        catch(Exception ex)
        {
            _logger.LogError(ex, "");
            //throw ex;
        }
        //throw new NotImplementedException();
    }

responseBody 变量始终为空字符串。但我在 Postman 上得到以下回复:

{"custId": "1235","Channel": "InternetBanking"}

为什么我不能在我的 responseBody 变量上得到这个?

【问题讨论】:

    标签: c# .net-core asp.net-core-2.0 asp.net-core-webapi


    【解决方案1】:

    您的问题是您创建了一个内存流,将其分配给 Response.Body 但从不填充它:

    using (var memStream = new MemoryStream())
    {
        context.HttpContext.Response.Body = memStream;
    
        memStream.Position = 0;
        responseBody = new StreamReader(memStream).ReadToEnd();
    
        ...
    }
    

    在这段代码中,memStream 只是一个空流,所以当您阅读它时,它什么也没有。

    如果您尝试访问控制器方法的结果,那么您可以通过context.Result 属性获取它。

    或者您只是想在返回调用者之前记录响应正文?过滤器不是执行此操作的正确位置 - 它们更关心控制器方法中的参数和返回的对象。 MVC 管道尚未填充 Response.Body,因此您无法访问它 - 这是由 MVC 中间件完成的。

    您需要创建自己的自定义中间件以在 Response 对象已填充时拦截调用,您可以将其写入日志。有许多网站可以向您展示如何做到这一点。一个例子是here

    【讨论】:

      猜你喜欢
      • 2017-06-22
      • 1970-01-01
      • 2017-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-05
      • 1970-01-01
      • 2018-08-09
      相关资源
      最近更新 更多