`

让 ASP.NET MVC 支持 HotSwap

 
阅读更多
<iframe align="top" marginwidth="0" marginheight="0" src="http://www.zealware.com/46860.html" frameborder="0" width="468" scrolling="no" height="60"></iframe>
导读:

  

  在HowToStart那帖中,我提到了ASP.NET MVC的问题 :

  如果修改一次Controller的代码,就导致ASP.NET重启一次 , 那么会不会很麻烦?

  有时候一个项目大一点, ASP.NET启动一次需要几十秒, 那样的等待真的很浪费时间.

  与思归的交谈中, 他提到了HotSwap的概念. "热插拔" - 编写代码后不需要重新编译或重启ASP.NET.

  怎样实现这个功能呢? 现在MVC的文档很少. 只能通过Reflector去找答案了.

  一个Request,从Url, 一直到了具体的 Controller , 经过了那些步骤呢?

  下面列出了这个步骤的详细:

  1. Url

  2. RouteTable

  3. MvcRouteHandler

  4. MvcHandler

  5. ControllerBuilder

  6. ControllerFactory

  7. Controller

  这个过程中, MvcRouteHandler 是连接 RouteTable 和 MvcHandler 的桥梁.

  MvcHandler则根据传递过来的信息, 根据某种规则, 从所有的Assembly中找到对应的Controller类

  然后把类型信息传递给 ControllerBuilder/ControllerFactory , 用于指定一个更具体的Controller.

  (类似RuntimeEntity那篇文章说的子类化模式..)

  看来, 需要对MvcHandler下手了. 而 MvcRouteHandler 则就是 MvcHandler 的 Factory.

  所以同时也要编写MvcRouteHandler的实现 :

  public class HotSwapMvcRouteHandler : System.Web.Mvc.MvcRouteHandler

  {

  protected override IHttpHandler GetHttpHandler(System.Web.Mvc.RequestContext requestContext)

  {

  HotSwapMvcHandler handler = new HotSwapMvcHandler();

  handler.RequestContext = requestContext;

  return handler;

  }

  }

  public class HotSwapMvcHandler : System.Web.Mvc.MvcHandler

  {

  protected override Type GetControllerType(string controller)

  {

  string name = controller + "Controller";

  string file = "~/Controllers/" + name + ".cs";

  if (!System.IO.File.Exists(HttpContext.Current.Server.MapPath(file)))

  return base.GetControllerType(controller);

  System.Reflection.Assembly assembly = System.Web.Compilation.BuildManager.GetCompiledAssembly(file);

  return assembly.GetType(name, true, true);

  }

  }

  上面2个类, 写在App_Code里就OK了, 然后, 需要修改一下 RouteTable 的写法:

  RouteTable.Routes.Add(new Route

  {

  Url = "[controller]/[action]/[id]",

  Defaults = new { action = "Index", id = "" },

  RouteHandler = typeof(HotSwapMvcRouteHandler)

  });

  注意一下 , RouteHandler由MvcRouteHandler替换成 HotSwapMvcRouteHandler 了.

  这样HotSwapMvcRouteHandler的代码就能够被执行, 返回HotSwapMvcHandler

  HotSwapMvcHandler 这里得到了一个 controller 的参数, 就是它了.

  我们要做的事情,就是根据它 , 找到我们想要的 Controller

  上面的GetControllerType的具体实现也实在太简单了.

  如果存在 ~/Controllers/XxxControler.cs

  就编译它, 然后直接返回 XxxController 类型.

  否则就按传统的方式去寻找对应的类.

  ----

  OK , 就这样2步, 就实现了在 ~/Controllers/ 中存放Controller代码的目的了.

  重温一下这2步:

  1. App_Code中增加 HotSwapMvcRouteHandler , HotSwapMvcHandler

  2. Global.asax中修改RouteTable的定义

  然后,就可以在 ~/Controllers/ 下增加 TestController.cs , 内容是

  public class TestController : Controller

  {

  [ControllerAction]

  public void Index()

  {

  ViewData["typename"] = this.GetType().AssemblyQualifiedName;

  ViewData["version"] = "version5";

  RenderView("index");

  }

  }

  然后创建对应的 ~/Views/Test/index.aspx 把东西显示出来:

  index.aspx

  


  

  


  

  


  

  显示:

  version5

  --------------------------------------------------------------------------------

  TestController, App_Web_testcontroller.cs.39ee6e8a.c0bebgfm, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null

  --------------------------------------------------------------------------------

  111

  不断地刷新它, Application["mystr"]就会越来越长.

  然后去修改 TestController.cs 把. 把ViewData["version"] = "version123";

  那么就会立刻生效, 显示version123,而Application["mystr"]没有重置, 证明ASP.NET并没有重启.

  想提高开发的方便性的朋友 , 不妨试试上面的代码.



本文转自

http://blog.joycode.com/lostinet/archive/2007/12/11/112496.aspx

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1929196


分享到:
评论

相关推荐

    Java hotswap demo

    Java hotswap示例。参考http://www.ibm.com/developerworks/cn/java/j-lo-hotswapcls/

    hotswap-agent+DCEVM-full

    hotswap-agent-1.3.1-SNAPSHOT.jar+DCEVM-full-7u79-installer.jar 适用jdk版本1.7.0_79 DCEVM-full-7u79-installer.jar需要在所在目录用java -jar命令运行,jvm运行只指定加载了DCEVM的jdk,运行时jvm设置参数 ...

    HotSwap!.EXE

    HotSwap正式版是占用内存很小且使用范围很广泛的硬盘热插拔软件,HotSwap最新版可智能识别系统的热插拔设备,在系统中增加一个图标,方便关闭SATA硬盘,这样你的热插拔设备就会比较安全了

    修改java类不需要重启jboss的利器--hotswap安装手册

    修改java类不需要重启jboss的利器--hotswap安装手册

    CPCI Hotswap ----- PICMG 2.1 R2.0(Hot Swap)-2

    接CPCI Hotswap ----- PICMG 2.1 R2.0(Hot Swap)-1

    hotswap-for-java-file.zip

    默认的时候会在HotSwapManager的static模块启动时创建一个hotswap文件夹, hotswap文件夹中有三个文件 1、classes文件夹,就是把java文件编译出来的class文件存放位置 2、java文件夹,就是你要热更的java文件存放...

    CPCI Hotswap ----- PICMG 2.1 R2.0(Hot Swap)-1

    CPCI 热插拔设计规范,希望对大家有用! 由于容量大小限制,这是前部分,后部分在另一主题: CPCI Hotswap ----- PICMG 2.1 R2.0(Hot Swap)-2

    HotSwap-sata硬盘热插拔工具

    HotSwap,是一款专业的sata硬盘热插拔工具。 大家都知道SATA因盘和ESATA硬盘都可以实现热插拔,可是又不像USB设备一样在系统托盘区有一个关闭图标,如果不关闭就拔下的话,可能造成硬盘数据不完整,严重的还会损坏...

    hotswap-module:无需任何代码更改即可将Node.js模块替换为另一个模块

    npm install hotswap-module --global CLI用法 以下三个命令均运行script.js文件,并将对require('stream')任何调用替换为require('readable-stream') 。 如果未安装hotswap-module ,只需使用npx运行它: npx hot...

    PMBus™ Application Profile for Hot Swap Controllers V1.0.pdf

    PMBus™ Application Profile for Hot Swap Controllers V1.0.pdf

    rust-hotswap:在运行的可执行文件中轻松进行热交换功能

    添加hotswap和hotswap-runtime依赖于你的Cargo.toml 。 将具有相同项目名称和路径的dylib构建添加到Cargo.toml 。 添加#![feature(plugin, const_fn)]功能门。 导入插件#![plugin(hotswap)] 。 使用#[hotswap]...

    classloader体系结构(含hotswap)

    重温java之classloader体系结构(含hotswap) 启动类加载器 扩展类加载器 系统类加载器

    sata硬盘热插拔工具:HotSwap ┆V5.0.0.0 多国语言版 V6.0.0.0 多国语言版 V6.1.0.0 多国语言版

    HotSwap,是一款专业的sata硬盘热插拔工具。大家都知道SATA因盘和ESATA硬盘都可以实现热插拔,可是又不像USB设备一样在系统托盘区有一个关闭图标,如果不关闭就拔下的话,可能造成硬盘数据不完整,严重的还会损坏...

    热插拔「Hot Swap」-crx插件

    HotSwap交换了有关2016年大选的所有帖子(从过道的每一侧)与相关的,可操作的政治参与信息,并抛出了GIF幼犬,以作为一种很好的措施。 帖子不会以任何方式删除或删除。 您仍然可以选择查看它们,但是默认情况下它们...

    think-hotswap:一个简单的Java类替换工具

    think-hotswap一个简单的Java类替换工具简介本工具采用Java内部提供的Instrumentation来实现类的热替换操作,故不支持修改类结构与类方法的操作,但是能在不修改类结构和方法的情况下,简单的修改其方法内部的一些...

    热插拔插件Mojito-rs-Hotswap.zip

    Mojito-rs-Hotswap 是 Mojito 资源存储的热插拔(Hotswap)插件。 标签:Mojito 分享 window._bd_share_config = { "common": { "bdSnsKey": {}...

    common-tools-hotswap.zip

    1、需要用到的agent/commons-agent.jar为hotswap打出来的包(HotSwapManager中定义) 2、需要用到lombok插件 3、测试的class为 DemoTestClazz 4、定时检测热更的class为CheckHotwapSchedule 5、热更后...

    前端开源库-hotswap

    前端开源库-hotswaphotswap,用于node.js模块的代码热交换

    SharpDevelop v4.4.0 Build 9722

    这个编辑器的界面风格类似于Office XP以及VS.NET,这个编辑器可以支持书写C#, ASP.NET, ADO.NET, XML, HTML 等多种代码, 支持基于项目或者是文件的开发,可以对C#, HTML, ASP, ASP.NET, VBscript, VB.NET, XML 提供...

    电源技术中的Linear推出2.9V至15V热插拔(Hot Swap)控制器

    凌力尔特公司(Linear)推出2.9V至15V热插拔(Hot Swap)控制器LTC 4280,该器件具内置8位ADC和I2C兼容接口。集成的数字电源监视可在高可用性系统中实现复杂的平台管理,测量板卡电压和电流以及记录过去和现在的故障情况...

Global site tag (gtag.js) - Google Analytics