Как прочитать тело запроса в OnActionExecuting (контекст ActionExecutingContext) в ядре IActionFilter Asp.net - PullRequest
0 голосов
/ 22 мая 2019

Я отправляю тело зашифрованного запроса AES контроллеру, вот пример:

(using crypto-js) 
{body: "U2FsdGVk186Jj7LySqT966qTdpQZwiR+wR0GjYqBzR4ouFAqP8Dz8UPPTv"}

Я создал фильтр действий, поэтому всякий раз, когда запрос публикуется, я могу расшифровать запрос в фильтре действий, а затем передать дешифрованный запрос нужному контроллеру.

запрос после расшифровки:

{Name: "admin123" }

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

Я пробовал WEB API в ядре ASP.NET StreamReader, но он возвращает пустую строку

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

фильтр

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; }
}

Ответы [ 2 ]

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

Здесь вам нужно перейти на промежуточное программное обеспечение. Прочитайте документацию Промежуточное программное обеспечение если вы хотите прочитать поток, вы должны выполнить request.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 . В противном случае вы получите исключение для пустого тела.

0 голосов
/ 22 мая 2019

Попробуйте это:

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