快速业务通道

ASP.Net 4.0中新增23项功能

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-20

在即将发布的Kooboo CMS 2.1.0.0中,将会升级到ASP.NET MVC 2。需要将所 有的Module也同步升级到MVC2,在升级过程中发现MVC2一旦进入View输出阶段后 ,Response.Clear将会不起作用 (Controller执行阶段,这个方法仍然正常工作) ,这将会影响Kooboo  CMS Module的正常运行。

在确定是MVC 2引起的问题后,于是就从Response.Clear这个方法着手,它的 代码逻辑如下:

01 public void Clear()
02 {
03     if  (this.UsingHttpWriter)
04     {
05          this._httpWriter.ClearBuffers();
06     }
07      IIS7WorkerRequest wr = this._wr as IIS7WorkerRequest;
08      if (wr != null)
09     {
10          this.ClearNativeResponse(true, false, wr);
11     }
12 }
13 <font face="Trebuchet MS">

从这段代码,我们可以发现,ClearBuffer的条件是UsingHttpWriter这个属性 的值为True,下面是UsingHttpWriter属性的原型定义:</font>

1 private bool UsingHttpWriter
2 {
3      get
4     {
5         return ((this._httpWriter  != null) && (this._writer == this._httpWriter));
6      }
7 }

在这里判断,_httpWriter和_writer变量是否相同。于是我就只能从运行时的 调试来看看这两个变量的值分别是什么,下面的截图分别是_httpWriter, _writer,UsingHttpWriter运行时的值:

在这里我们会发现UsingHttpWriter的值为fase,并且_writer的对象类型为 System.Web.Mvc.ViewPage.SwitchWriter,此时我们就可以断定Response.Clear 起作用的原因就是由 SwitchWriter这个类为引起的。找到这个类,我们会发现它 在ViewPage.RenderView(ViewContext viewContext)方法中被使用:

01 public virtual void RenderView(ViewContext  viewContext)
02 {
03     this.ViewContext =  viewContext;
04     this.InitHelpers();
05     bool  flag = false;
06     SwitchWriter output =  viewContext.HttpContext.Response.Output as SwitchWriter;
07      if (output == null) 
08     {
09          output = new SwitchWriter();
10         flag =  true;
11     }
12     using (output.Scope (viewContext.Writer)) 
13     {
14         if  (flag) 
15         {
16              int num = _nextId;
17             try
18              {
19                  _nextId = 0;
20                  viewContext.HttpContext.Server.Execute (HttpHandlerUtil.WrapForServerExecute(this), output, true);
21                  return;
22              }
23             finally
24              {
25                 _nextId = num;
26             }
27         }
28          this.ProcessRequest(HttpContext.Current);
29      }
30 }

而对应的方法在MVC 1.0中,它的实现是这样的:

1 public virtual void RenderView(ViewContext  viewContext) 
2 {
3     this.ViewContext =  viewContext;
4     this.InitHelpers();
5      this.ID = Guid.NewGuid().ToString();
6      this.ProcessRequest(HttpContext.Current);
7 }

于是我 们就找到解决这个问题的办法了,我们只要在我们项目的ViewPage中,重新 RenderView(ViewContext viewContext)这个方法, 让它回到原来的实现就可以 解决这个问题了。

这个问题解决了,但是另一个问题我现在仍在思考当中 ,为什么在MVC2中,要增加SwitchWriter这个类呢?我仔细了看了好几遍这个类 的实现,只是对TextWriter的简单包装而已,并没有增加其它额外的功能。我目 前实在还是想不明白为什么要这样做?

http://hjf1223.cnblogs.com

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号