asp.net mvc 4,模型绑定改变了线程?
Posted
技术标签:
【中文标题】asp.net mvc 4,模型绑定改变了线程?【英文标题】:asp.net mvc 4, thread changed by model binding? 【发布时间】:2013-09-05 18:52:59 【问题描述】:我在 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 中的应用程序事件处理程序相同的线程上调用
【问题讨论】:
【参考方案1】:事实证明,我的核心假设是不正确的——控制器操作不是在与事件处理程序相同的线程上调用的。
这是来自 Environment.StackTrace 的 sn-p,它显示了异步进程(在另一个线程上)调用的控制器操作。
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()
看起来我将在会话中存储我的性能分析上下文。
【讨论】:
看起来这已经改变了。我目前看到 MVC 操作方法与 Application_BeginRequest 在同一线程上执行 请忽略我的上一个。评论,在重负载下仍然无法预测。以上是关于asp.net mvc 4,模型绑定改变了线程?的主要内容,如果未能解决你的问题,请参考以下文章