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

C# 如何在IActionFilter Asp.net core中的OnActionExecuting(ActionExecutingContext上下文)中读取请求正文,c#,asp.net-core,asp.net-core-webapi,C#,Asp.net Core,Asp.net Core Webapi,我正在向控制器发送AES加密请求正文,以下是一个示例: (using crypto-js) {body: "U2FsdGVk186Jj7LySqT966qTdpQZwiR+wR0GjYqBzR4ouFAqP8Dz8UPPTv"} 我已经创建了action filter,所以无论何时发布请求,我都可以在action filter中对请求进行解密,然后将解密后的请求传递给所需的控制器 解密后的请求: {Name: "admin123" } 那么,如何在操作过滤器中获得加密的请求体呢?以及如何将

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

(using crypto-js) 
{body: "U2FsdGVk186Jj7LySqT966qTdpQZwiR+wR0GjYqBzR4ouFAqP8Dz8UPPTv"}
我已经创建了action filter,所以无论何时发布请求,我都可以在action filter中对请求进行解密,然后将解密后的请求传递给所需的控制器

解密后的请求:

{Name: "admin123" }
那么,如何在操作过滤器中获得加密的请求体呢?以及如何将解密的请求体传递给控制器

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

}
我在ASP.NET core
StreamReader
中尝试了WEB API,但它返回了一个空字符串

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

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

}
滤器

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)
{

}
试试这个:

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

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

 request.EnableRewind();
在阅读之后,应用您的逻辑,然后您需要在响应中添加
原始流。正文

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。
否则,您将获得空正文异常。

您可以使用
StreamReader
ReadToEndAsync()
例程

以下是
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
}
您可以使用:

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

这是正确的答案@下流选民。有什么评论吗?