2013-09-02 1 views
3

Я использую пользовательский ModelBinder в приложении MVC 4, но он вызывается в другом потоке, чем обработчики событий запроса в global.asax, и это делает настройку контекста профилирования производительности в ошибке ThreadLocal.asp.net mvc 4, нить изменена заменой модели?

ThreadId находится в скобках в начале каждой строки, и вы можете видеть, что нить изменяется при вызове привязки модели, и это поток, в котором выполняется действие контроллера (указатель).

[33] | ERROR | MyApp.MvcApplication | Application_BeginRequest 
[33] | ERROR | MyApp.MvcApplication | Application_AuthenticateRequest 
[33] | ERROR | MyApp.MvcApplication | Application_AuthorizeRequest 
[33] | ERROR | MyApp.MvcApplication | Application_ResolveRequestCache 
[33] | ERROR | MyApp.MvcApplication | Application_AcquireRequestState 
[33] | ERROR | MyApp.MvcApplication | Application_PreRequestHandlerExecute 
[52] | ERROR | Binders.MyModelBinder | ModelBinder 
[52] | ERROR | MyApp.Controllers.MyController | Index 

Любая идея, почему это происходит? Мое предположение заключалось в том, что методы контроллера всегда вызывались в том же потоке, что и обработчики событий приложения в global.asax

+0

На всякий случай проблема возникла из-за наличия связующих в отдельной DLL, я переместил их в основной проект и проблема осталась. –

ответ

0

Оказывается, что мое основное предположение было неправильным - действия контроллера не вызываются в том же потоке, что и событие обработчики.

Вот фрагмент из Environment.StackTrace, который показывает действие контроллера, вызываемое асинхронным процессом (в другом потоке).

at System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.BeginExecute(RequestContext requestContext, AsyncCallback callback, Object state) 
at System.Web.Mvc.MvcHandler.<>c__DisplayClass8.<BeginProcessRequest>b__2(AsyncCallback asyncCallback, Object asyncState) 
at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.Begin(AsyncCallback callback, Object state, Int32 timeout) 
at System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) 
at System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state) 
at System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) 
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 

Похоже, что вместо этого я сохраню контекст профилирования производительности в сеансе.