c# - 如何在asp.net核心的IActionFilter中更改请求正文
问题描述
目前我正在向 asp.net 核心控制器发送加密请求。以下是请求正文结构:
{
"body": "pEbXVvl1ue95eGQywK/q80cGHjYk+2VNPYEgnRgU+vI="
}
在此之前我已经实现了过滤器IActionFilter
,所以在OnActionExecuting(ActionExecutingContext context)
我解密上面提到的请求正文(正文密钥)的地方
解密后,我得到了解密后的请求体,如下所示:
{
"Urno":"URN123456"
}
解密后,我想将解密后的请求(上面提到的"Urno":"URN123456"
)主体传递给控制器
我曾尝试将字符串转换为字节而不是将其传递给Request.body
但没有成功:
public void OnActionExecuting(ActionExecutingContext context)
{
var request = context.HttpContext.Request;
request.EnableRewind();
request.Body.Position = 0;
using (var reader = new StreamReader(request.Body))
{
var bodyString = reader.ReadToEnd(); //{ "body": "pEbXVvl1ue95eGQywK/q80cGHjYk+2VNPYEgnRgU+vI="}
if (bodyString != "")
{
var data = JObject.Parse(bodyString);
var key = data.GetValue("body");
var keybytes = Encoding.UTF8.GetBytes("808080808080808011");
var iv = Encoding.UTF8.GetBytes("8080808080808080111");
var encrypted = Convert.FromBase64String(key.ToString());
var decriptedFromJavascript = DecryptStringFromBytes(encrypted, keybytes, iv); //{ "Urno":"URN123456"}
byte[] bytes = Encoding.ASCII.GetBytes(decriptedFromJavascript);
request.Body = new MemoryStream(bytes); // here i am trying to change request body
}
}
}
// controller
[HttpPost("[action]")]
public async Task<string> GetInvestorUrno(Urnoinvestor InfoReq){
}
// class
public class Urnoinvestor
{
public string Urno{ get; set; }
}
我想更改请求正文并将解密的请求传递给控制器
解决方案
对于您的情况,IActionFilter
将无法正常工作。检查此图像:
在Model binding
之前运行,ActionFilter
这意味着无论您对 body 进行什么更改,它都不会更改模型。您需要在模型绑定之前尝试过滤器,例如Resource filter
.
改成
Resource filter
public class RequestBodyFilter : IResourceFilter { public void OnResourceExecuted(ResourceExecutedContext context) { //throw new NotImplementedException(); } public void OnResourceExecuting(ResourceExecutingContext context) { var request = context.HttpContext.Request; request.EnableRewind(); request.Body.Position = 0; using (var reader = new StreamReader(request.Body)) { var decriptedFromJavascript = "{ \"Urno\":\"URN123456\"}"; //{ "Urno":"URN123456"} byte[] bytes = Encoding.ASCII.GetBytes(decriptedFromJavascript); request.Body = new MemoryStream(bytes); // here i am trying to change request body } } }
由于您是从正文绑定的,因此您需要
[FromBody]
根据@Tony Abrams 的建议指定操作。[HttpPost("[action]")] [TypeFilter(typeof(RequestBodyFilter))] public async Task<string> GetInvestorUrno([FromBody]Urnoinvestor InfoReq) { return InfoReq.Urno; }
推荐阅读
- java - 私有方法的 AOP 注释
- asp.net-core - 如何处理多层1对多关系的DAL?
- c - 什么种族导致输出看起来不同?
- php - php图像上传并添加文本
- javascript - 如何将工具提示添加到 fullcalander
- ssl - SSL 握手在 NGinx 上游失败
- mysql - MySql 登录问题 - 未加载 auth_socket
- azure - 图标在 Azure DevOps 管道的发布任务目录中不可见。vss-extension.json 如下,
- javascript - axios里面的for循环
- python - psycopg2.OperationalError:致命:不支持的前端协议 1234.5679:服务器支持 2.0 到 3.0