Как изменить тело запроса в IActionFilter в ядре asp.net - PullRequest
0 голосов
/ 23 мая 2019

В настоящее время я отправляю зашифрованный запрос на главный контроллер 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; }
}

Я хочу изменить тело запроса и передать расшифрованный запрос контроллеру

Ответы [ 2 ]

1 голос
/ 24 мая 2019

Для вашего сценария IActionFilter не будет работать. Проверьте это изображение:

enter image description here

Model binding запускается до ActionFilter, что означает, что независимо от того, что вы изменили в теле, модель не изменится. Вам нужно попробовать фильтр перед привязкой модели, например Resource filter.

  1. Изменить на 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
            }
        }
    }
    
  2. Поскольку вы связываетесь с телом, вам нужно указать действие с [FromBody] в качестве предложения от @Tony Abrams.

    [HttpPost("[action]")]
    [TypeFilter(typeof(RequestBodyFilter))]
    public async Task<string> GetInvestorUrno([FromBody]Urnoinvestor InfoReq)
    {
        return InfoReq.Urno;
    }
    
0 голосов
/ 23 мая 2019

У вас нет параметра, помеченного как from body, поэтому он не загружает данные из тела запроса.Вместо этого он ожидает этого в URI.

Попробуйте вместо этого:

[HttpPost("[action]")]
public async Task<string> GetInvestorUrno([FromBody]Urnoinvestor InfoReq){

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...