2013-11-18 3 views
1

У меня есть сайт MVC 4.0, который использует пакет асинхронного/ожидающего BCL. Чтобы сохранить HttpContext по исходной нити и последующей нити (после ОЖИДАНИЯ) Я начал с созданием закрытия с ссылкой на контекст, как так:async ждет с .net 4.0 - поддерживать статический контекст

public async Task<ViewResult> GetCustomer(int id) 
     {    
     var ctx = HttpContext.Current; 
     ctx["test"] = "test"; 

     await DoSomeLongRunningIO(); 

     var test = ctx["test"]; 
     //do other things with context 

     return View(); 
    } 

Однако, мне нужно позвонить различные услугам после AWAIT , Эти устаревшие службы напрямую ссылаются на HttpContext.Current. Итак, я подошел к этому со следующим кодом, который казался простым способом обеспечить, чтобы эти службы работали должным образом.

public async Task<ViewResult> GetCustomer(int id) 
     {    
     var ctx = HttpContext.Current; 

     await DoSomeLongRunningIO(); 

     HttpContext.Current = ctx; 

     //call other services which use static references to httpcontext 
     return View(); 
    } 

Это работает, но я читал this answer that suggests it is a bad idea:

  1. это плохая идея, и если да, то почему это хуже, чем в первом примере?

Спасибо за ваше время.

ответ

3

Знаете ли вы, что async/await in an ASP.NET app on .NET 4.0 is undefined?

Если вы переходите на .NET 4.5, вы обнаружите, что HttpContext сохраняется автоматически для вас. Там нет необходимости закрывать или устанавливать его.

Установка HttpContext.Current - плохая идея, потому что вы обходите проверки безопасности ASP.NET, которые обеспечивают только один поток за раз с этим контекстом.

+0

благодарит за ваш ответ. когда мы говорим undefined, что это значит? (я прочитал ссылку, но не понял). К сожалению, я не могу использовать 4.5. Из моего кода выше, я не думал, что когда-либо буду в состоянии, когда у меня есть 2 потока с одним контекстом за один раз? Это всегда будет 1 поток и 1 контекст (в любой момент). – jonho

+1

@jonho: «Undefined» является сокращением для «неопределенного поведения». Это означает, что он не будет работать правильно. –

+0

Я решил использовать TPL вместо этого. – jonho

Смежные вопросы