2013-09-02 7 views
3

MVC 4 응용 프로그램에서 사용자 지정 ModelBinder를 사용하고 있지만 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() 

보인다.