C# 如何在IActionFilter Asp.net core中的OnActionExecuting(ActionExecutingContext上下文)中读取请求正文
我正在向控制器发送AES加密请求正文,以下是一个示例: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" } 那么,如何在操作过滤器中获得加密的请求体呢?以及如何将
(using crypto-js)
{body: "U2FsdGVk186Jj7LySqT966qTdpQZwiR+wR0GjYqBzR4ouFAqP8Dz8UPPTv"}
我已经创建了action filter,所以无论何时发布请求,我都可以在action filter中对请求进行解密,然后将解密后的请求传递给所需的控制器
解密后的请求:
{Name: "admin123" }
那么,如何在操作过滤器中获得加密的请求体呢?以及如何将解密的请求体传递给控制器
[HttpPost("[action]")]
public async Task<string> MyControllerName(InfoReq info)
{
}
我在ASP.NET coreStreamReader
中尝试了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 ;
这是正确的答案@下流选民。有什么评论吗?