Я пытаюсь реализовать выходной кэш в WebApi, который может кэшировать ответы, уже обработанные фильтрами, и генерировать ответы, которые не обрабатываются formatters.WebApi Output Cache
Из того, что я видел, OnActionExecuting и OnActionExecuted ActionFilterAttribute выполняются перед формированием поля сериализации, поэтому, если вы кешируете ответ, при ударе кеша вы ответите на тот же самый контент и этот контент будет снова сериализован для передачи.
Как возможное решение в MVC, я думаю, что вы можете сделать это, реализовав IResultFilter, который переопределяет OnResultExecuted путем кэширования сериализованного ответа. При таком подходе я не знаю, как перехватить обработку запроса, чтобы избежать форматирования сериализации, я думаю, что возможным решением для перехвата является создание настраиваемого ActionResult, обрабатываемого непосредственно IResultFilter. Обратите внимание, что это решение не подходит для меня, потому что я реализую OutputCache в приложении WebApi.
Здравствуйте, я очень благодарен за ваш ответ, но что, если вы создали ByteArrayContent вместо StreamContent, используя ReadAsByteArrayAsync? – IgrCndd
Да, даже если вы зададите ответ как ByteArrayContent, форматирующие элементы не будут задействованы ... Можете ли вы подробнее рассказать о том, что вы подразумеваете под ReadAsByteArrayAsync? Здесь речь шла о написании resposne, поэтому я не понимаю, что вы подразумеваете под «использованием ReadAsByteArrayAsync»? –
Что я имею в виду, вместо того, чтобы использовать CopyToAsync в потоке памяти, вы можете получить байт [] вашего ответа, уже отформатированный и сохраняющий их. Когда у вас есть кэш, вы можете получить свои кэшированные отформатированные байты ответа и создать ByteArrayContent, чтобы быть содержимым вашего ответа на ответ в кеш. Есть ли недостаток в использовании этой стратегии вместо вашей, я имею в виду, что WebApi имеет какое-либо преимущество с помощью StreamContent вместо ByteArrayContent? Снова очень благодарен за вашу помощь – IgrCndd