【问题标题】:How to read request body in OnActionExecuting(ActionExecutingContext context) in IActionFilter Asp.net core如何在 IActionFilter Asp.net 核心中读取 OnActionExecuting(ActionExecutingContext 上下文)中的请求正文
【发布时间】:2021-04-26 15:34:18
【问题描述】:

我正在向控制器发送 AES 加密请求正文,以下是示例:

(using crypto-js) 
{body: "U2FsdGVk186Jj7LySqT966qTdpQZwiR+wR0GjYqBzR4ouFAqP8Dz8UPPTv"}

我已经创建了动作过滤器,所以无论何时发布请求,我都可以在动作过滤器中解密请求,而不是将解密后的请求传递给所需的控制器。

解密后请求:

{Name: "admin123" }

那么如何在动作过滤器中获取加密的请求正文?以及如何将解密后的请求正文传递给控制器​​

我在 ASP.NET 核心 StreamReader 中尝试过 WEB API,但它返回一个空字符串

我想将解密后的请求正文传递给控制器​​

过滤器

public void OnActionExecuting(ActionExecutingContext context)
{
    var req = context.HttpContext.Request;
    using (StreamReader reader = new StreamReader(req.Body, Encoding.UTF8, true, 1024, true))
    {
        bodyStr = reader.ReadToEnd();
    }
    req.Body.Position = 0;
}

控制器

[HttpPost("[action]")]
public async Task<string> MyControllerName(InfoReq info)
{

}

public class InfoReq 
{
    public string Name{ get; set; }
}

【问题讨论】:

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


    【解决方案1】:

    这里你需要使用中间件方法。阅读文档Middleware 如果你想读取流,你必须请求。EnableRewind()。因为Request. body 是一个只读和转发流,不支持第二次读取流。

     request.EnableRewind();
    

    阅读后应用您的逻辑,然后您需要添加original stream back on the Response. Body的请求

    public void OnActionExecuting(ActionExecutingContext context)
       {              
        var request = context.HttpContext.Request;
         try
            {
                request.EnableRewind();
                using (StreamReader reader = new StreamReader(request.Body))
                {
                    return reader.ReadToEnd();
                }
            }
            finally
            {
                request.Body = request; 
            }
            context.Request.Body.Position = 0
            return string.Empty;
        }
    

    您应该必须将流位置设置为零(0) request.Body.Position = 0 . 否则会出现空体异常。

    【讨论】:

      【解决方案2】:

      你可以使用:

      var body = context.ActionArguments["info"] as InfoReq ;
      

      【讨论】:

      • 这是正确答案。 @downvoter。想发表评论吗?
      • 我同意这行得通。我想知道怎么可能。但后来我查看了动作过滤器的生命周期,我看到了。 ActionFilter 在模型绑定之后进行,因此已经读取了正文流并且已经解析了数据。来源:docs.microsoft.com/en-us/aspnet/core/mvc/controllers/…
      【解决方案3】:

      您可以使用StreamReaderReadToEndAsync() 例程

      这是OnActionExecuting方法的代码:

      public void OnActionExecuting(ActionExecutingContext context)
      {              
          var request = context.HttpContext.Request;
          string requestBody;
          using (StreamReader reader = new StreamReader(request.Body))
          {
              requestBody=  Task.Run(reader.ReadToEndAsync).Result;
          }
            
          //do something with the requestBody
      }
      

      【讨论】:

        【解决方案4】:

        试试这个:

            [HttpPost]
            public void Post([FromBody]string info)
            {
                Console.WriteLine(info);
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-03-23
          • 1970-01-01
          • 2017-03-22
          • 2019-02-17
          • 1970-01-01
          • 1970-01-01
          • 2021-10-29
          相关资源
          最近更新 更多