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