千家信息网

怎么用ASP.NET MVC源代码寻找解决方案

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,怎么用ASP.NET MVC源代码寻找解决方案,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。ASP.NET MVC源代码来寻找解决方
千家信息网最后更新 2026年11月01日怎么用ASP.NET MVC源代码寻找解决方案

怎么用ASP.NET MVC源代码寻找解决方案,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

ASP.NET MVC源代码来寻找解决方案,由于在Action方法中可以调用BeginXxx方法,我们在AsyncActionResult中只需保留Begin方法返回的IAsyncResult,以及另一个对于EndXxx方法的引用。在AsyncActionResult的ExecuteResult方法中将会保存这两个对象,以便在AsyncMvcHandler的EndProcessRequest方法中重新获取并使用。根据"惯例",我们还需要定义一个扩展方法,方便开发人员在Action方法中返回一个AsyncActionResult。具体实现非常容易,在这里就展示一下异步Action的编写方式:

[AsyncAction]  publicActionResultAsyncAction(AsyncCallbackasyncCallback,objectasyncState)  {  SqlConnectionconn=newSqlConnection("...;AsynchronousProcessing=true");  SqlCommandcmd=newSqlCommand("WAITFORDELAY'00:00:03';",conn);  conn.Open();   returnthis.Async(  cmd.BeginExecuteNonQuery(asyncCallback,asyncState),  (ar)=> {  intvalue=cmd.EndExecuteNonQuery(ar);  conn.Close();  returnthis.View();  });  }

至此,似乎AsyncMvcHandler也无甚秘密可言了:

publicclassAsyncMvcHandler:IHttpAsyncHandler,IRequiresSessionState  {  publicAsyncMvcHandler(  Controllercontroller,  IControllerFactorycontrollerFactory,  RequestContextrequestContext)  {  this.Controller=controller;  this.ControllerFactory=controllerFactory;  this.RequestContext=requestContext;  }   publicControllerController{get;privateset;}  publicRequestContextRequestContext{get;privateset;}  publicIControllerFactoryControllerFactory{get;privateset;}  publicHttpContextContext{get;privateset;}   publicIAsyncResultBeginProcessRequest(  HttpContextcontext,  AsyncCallbackcb,  objectextraData)  {  this.Context=context;  this.Controller.SetAsyncCallback(cb).SetAsyncState(extraData);   try  {  (this.ControllerasIController).Execute(this.RequestContext);  returnthis.Controller.GetAsyncResult();  }  catch  {  this.ControllerFactory.ReleaseController(this.Controller);  throw;  }  }   publicvoidEndProcessRequest(IAsyncResultresult)  {  try  {  HttpContext.Current=this.Context;  ActionResultactionResult=this.Controller.GetAsyncEndDelegate()(result);  if(actionResult!=null)  {  actionResult.ExecuteResult(this.Controller.ControllerContext);  }  }  finally  {  this.ControllerFactory.ReleaseController(this.Controller);  }  }  }

在BeginProcessRequest方法中将保存当前Context--这点很重要,HttpContext.Current是基于 CallContext的,一旦经过一次异步回调HttpContext.Current就变成了null,我们必须重设。接着将接收到的 AsyncCallback和AsyncState保留,并使用框架中现成的Execute方法执行控制器。当Execute方法返回时一整个Action方法的调用流程已经结束,这意味着其调用结果--即IAsyncResult和EndDelegate对象已经保留。于是将IAsyncResult对象取出并返回。至于EndProcessRequest方法,只是将BeginProcessRequest方法中保存下来的EndDelegate取出,调用,把得到的ActionResult再执行一遍即可。

以上的代码只涉及到普通情况下的逻辑,而在完整的代码中还会包括对于Action方法被某个Filter终止或替换等特殊情况下的处理。此外,无论在BeginProcessRequest还是EndProcessRequest中都需要对异常进行合适地处理,使得Controller Factory能够及时地对Controller对象进行释放。

如果这个解决方案没有缺陷,那么相信它已经被放入ASP.NET MVC 1.0中,而轮不到我在这里扩展一番了。目前的这个解决方案至少有以下几点不足:

没有严格遵守.NET中的APM模式,虽然不影响功能,但这始终是一个遗憾。

由于利用了框架中的现成功能,所有的Filter只能运行在BeginXxx方法上。

由于EndXxx方法和最终ActionResult的执行都没有Filter支持,因此如果在这个过程中抛出了异常,将无法进入ASP.NET MVC建议的异常处理功能中。

根据ASP.NET MVC框架的Roadmap,ASP.NET MVC框架1.0之后的版本中将会支持异步Action,相信以上这些缺陷到时候都能被弥补。不过这就需要大量的工作,这只能交给ASP.NET MVC团队去慢慢执行了。事实上,您现在已经可以在ASP.NET MVC源代码的MvcFutures项目中找到异步Action处理的相关内容。它添加了 IAsyncController,AsyncController,IAsyncActionInvoker,AsyncControllerActionInvoker 等许多扩展。虽说它们都"继承"了现有的类,但是与我之前的判断相似,如AsyncControllerActionInvoker几乎完全重新实现了一遍ActionInvoker中的各种功能--我还没有仔细阅读代码,因此无法判断出这种设计是否优秀,只希望它能像ASP.NET MVC本身那样的简单和优雅。

我打算为现在的代码的EndXxx方法也加上Filter支持,我需要仔细阅读ASP.NET MVC源代码来寻找解决方案。希望它能够成为ASP.NET MVC正式支持异步Action之前较好的替代方案。

关于怎么用ASP.NET MVC源代码寻找解决方案问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。

方法 方案 解决方案 源代码 代码 功能 对象 框架 处理 支持 中将 问题 内容 情况 更多 缺陷 帮助 解答 合适 易行 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 手磨咖啡 伟宏互联网科技 亿人帮互联网科技有限公司 互联网科技工作委员会主任 江苏根荣互联网科技 科技信息互联网 礼当家互联网科技 互联网科技ppt模板 甘肃拓世互联网科技有限公司 山东吉时兔互联网科技有限公司 贵州叶脉互联网科技有限公司所属行业 链环科技传统企业怎么转型互联网 明优互联网科技有限公司 山东星卡互联网科技有限公司官网 上海创道互联网络科技有限公司 半导体行业属于互联网高科技类吗 扫呗互联网科技有限公司 上海乐五互联网科技有限公司 互联网科技平台产品运营 株洲百竞科技的互联网营销顾问 为想互联网科技怎么样 中国互联网科技股 广州互联网络科技有限公司 润盈互联网科技 互联网科技论坛 重庆科技学院互联网 栖莱科技互联网股份有限公司 互联网金融中的现代科技 保险科技服务互联网营销体系 陕西彩京云互联网科技有限公司
0