千家信息网

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

发表于:2025-02-22 作者:千家信息网编辑
千家信息网最后更新 2025年02月22日,怎么用ASP.NET MVC源代码寻找解决方案,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。ASP.NET MVC源代码来寻找解决方
千家信息网最后更新 2025年02月22日怎么用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安全错误 数据库的锁怎样保障安全 数据库三种存储引擎的适用情况 平度市天气预报软件开发 银行软件开发编制知乎 软件开发好还是网络好 东信网络安全绘画 域名解析到自己服务器 微信数据库er图 北京市交通流数据库 网络安全大学生征文 达梦数据库迁移工具栈溢出 数据库可以降低数据冗余吗 延庆区网络软件开发 青浦区市场软件开发诚信合作 苹果怎么清楚云数据库 戴尔服务器sn和序列号一样吗 数据库增量更新方法 开机启动到网络安全模式 有软件开发公司为了 验签服务器 odm 数据库服务器对象链接服务器 国外期刊查重都是用什么数据库 微信怎么连接不上服务器1 登录qq提示服务器连接失败 中国版怎么在服务器里切换材质包 网络安全法应当遵循 山东立体化软件开发品牌 地瓜网络技术钉钉视频下载器破解 运维用的软件开发 我的世界pcl2怎么玩服务器 创业之星为什么连接到服务器失败
0