2015-01-30 2 views
12

В традиционных приложениях ASP.NET (что использование System.Web), я кэшировать данные вкэширования данных по запросу в Owin применении

HttpContext.Current.Items 

Сейчас в Owin HttpContext больше не доступен. Есть ли способ сделать аналогичную вещь в Owin - a static метод/свойство, через которое я могу установить/получить на запрос данных?

Это question дало некоторые подсказки, но не точное решение в моем случае.

+0

Очень хороший вопрос ... –

ответ

16

И наконец, я нашел OwinRequestScopeContext. Очень прост в использовании.

В классе запуска:

app.UseRequestScopeContext(); 

Тогда я могу добавить в кэш запроса, как это:

OwinRequestScopeContext.Current.Items["myclient"] = new Client(); 

Тогда где-нибудь в моем коде я могу сделать (так же, как HttpContext.Current):

var currentClient = OwinRequestScopeContext.Current.Items["myclient"] as Client; 

Here является исходным кодом, если вам интересно. Он использует CallContext.LogicalGetData и LogicalSetData. Кто-нибудь видит какие-либо проблемы с этим подходом кэширования данных запроса?

+0

Я проголосовал за этот ответ, потому что; это новый подход, о котором я не знал. Я всегда использовал подход [DalSoft] (http://stackoverflow.com/users/324497/dalsoft). Кто-нибудь знает разницу между ними? Этот подход кажется более ** глобальным **, в то время как DalSoft кажется немного более ** локальным **, но я все еще не уверен в различии. –

+1

OwinRequestScopeContext.Current всегда равно null. Пожалуйста помоги. – Kumar

+0

В startup.cs вызовите app.UseRequestScopeContext(), прежде чем включить WebApi, или поместите его в самый верх. – Calvin

11

Вам просто нужно использовать 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"); 
Смежные вопросы