asp.net mvc 4,线程由模型绑定更改

本文关键字:模型 绑定 线程 net mvc asp | 更新日期: 2023-09-27 18:29:51

我在MVC 4应用程序中使用自定义ModelBinder,但它是在与global.asax中的请求事件处理程序不同的线程上调用的,这使得在ThreadLocal中设置性能评测上下文失败。

threadId位于每行开头的方括号中,您可以看到,当调用模型绑定时,线程会发生变化,这就是执行控制器操作(Index)的线程。

[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 中与应用程序事件处理程序相同的线程上调用

asp.net mvc 4,线程由模型绑定更改

事实证明,我的核心假设是不正确的——控制器操作与事件处理程序不是在同一个线程上调用的。

以下是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()

看起来我将把性能评测上下文存储在会话中。