Кэширование данных по запросу в приложении Owin
В традиционных приложениях ASP.NET(которые используют System.Web) я могу кэшировать данные в
HttpContext.Current.Items
Теперь в Owin HttpContext больше не доступен. Есть ли способ сделать аналогичную вещь в Owin - метод static , через который я могу установить/получить для каждого запроса?
Этот question дал некоторые подсказки, но не нашел точного решения в моем случае.
Ответы
Ответ 1
Наконец, я нашел OwinRequestScopeContext. Очень прост в использовании.
В классе Startup:
app.UseRequestScopeContext();
Затем я могу добавить кэш запросов следующим образом:
OwinRequestScopeContext.Current.Items["myclient"] = new Client();
Тогда где-нибудь в моем коде я могу сделать (как HttpContext.Current):
var currentClient = OwinRequestScopeContext.Current.Items["myclient"] as Client;
Здесь является исходным кодом, если вам интересно. Он использует CallContext.LogicalGetData и LogicalSetData. Кто-нибудь видит какие-либо проблемы с этим подходом к кэшированию данных запроса?
Ответ 2
Вам просто нужно использовать OwinContext для этого:
От вашего промежуточного программного обеспечения:
public class HelloWorldMiddleware : OwinMiddleware
{
public HelloWorldMiddleware (OwinMiddleware next) : base(next) { }
public override async Task Invoke(IOwinContext context)
{
context.Set("Hello", "World");
await Next.Invoke(context);
}
}
Из MVC или WebApi:
Request.GetOwinContext().Get<string>("Hello");