如何在IActionFilter Asp.net核心的OnActionExecuting(ActionExecutingContext上下文)中读取请求正文

时间:2019-05-22 13:39:15

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

我正在向控制器发送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; }
}

4 个答案:

答案 0 :(得分: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 .否则,您将获得空主体异常。

答案 1 :(得分:-1)

尝试一下:

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

答案 2 :(得分:-1)

您可以使用:

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

答案 3 :(得分:-3)

您可以使用StreamReader的{​​{1}}例程

这是ReadToEndAsync()方法的代码:

OnActionExecuting