在即将发布的Kooboo CMS 2.1.0.0中,将会升级到ASP.NET MVC 2。需要将所有的Module也同步升级到MVC2,在升级过程中发现MVC2一旦进入View输出阶段后,Response.Clear将会不起作用(Controller执行阶段,这个方法仍然正常工作),这将会影响Kooboo CMS Module的正常运行。
在确定是MVC 2引起的问题后,于是就从Response.Clear这个方法着手,它的代码逻辑如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 | public void Clear() { if ( this .UsingHttpWriter) { this ._httpWriter.ClearBuffers(); } IIS7WorkerRequest wr = this ._wr as IIS7WorkerRequest; if (wr != null ) { this .ClearNativeResponse( true , false , wr); } } <font face= "Trebuchet MS" >从这段代码,我们可以发现,ClearBuffer的条件是UsingHttpWriter这个属性的值为True,下面是UsingHttpWriter属性的原型定义:</font> |
1 2 3 4 5 6 7 | private bool UsingHttpWriter { get { return (( this ._httpWriter != null ) && ( this ._writer == this ._httpWriter)); } } |
在这里判断,_httpWriter和_writer变量是否相同。于是我就只能从运行时的调试来看看这两个变量的值分别是什么,下面的截图分别是_httpWriter,_writer,UsingHttpWriter运行时的值:
在这里我们会发现UsingHttpWriter的值为fase,并且_writer的对象类型为System.Web.Mvc.ViewPage.SwitchWriter,此时我们就可以断定Response.Clear起作用的原因就是由SwitchWriter这个类为引起的。找到这个类,我们会发现它在ViewPage.RenderView(ViewContext viewContext)方法中被使用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | public virtual void RenderView(ViewContext viewContext) { this .ViewContext = viewContext; this .InitHelpers(); bool flag = false ; SwitchWriter output = viewContext.HttpContext.Response.Output as SwitchWriter; if (output == null ) { output = new SwitchWriter(); flag = true ; } using (output.Scope(viewContext.Writer)) { if (flag) { int num = _nextId; try { _nextId = 0; viewContext.HttpContext.Server.Execute(HttpHandlerUtil.WrapForServerExecute( this ), output, true ); return ; } finally { _nextId = num; } } this .ProcessRequest(HttpContext.Current); } } |
而对应的方法在MVC 1.0中,它的实现是这样的:
1 2 3 4 5 6 7 | public virtual void RenderView(ViewContext viewContext) { this .ViewContext = viewContext; this .InitHelpers(); this .ID = Guid.NewGuid().ToString(); this .ProcessRequest(HttpContext.Current); } |
于是我们就找到解决这个问题的办法了,我们只要在我们项目的ViewPage中,重新RenderView(ViewContext viewContext)这个方法, 让它回到原来的实现就可以解决这个问题了。
这个问题解决了,但是另一个问题我现在仍在思考当中,为什么在MVC2中,要增加SwitchWriter这个类呢?我仔细了看了好几遍这个类的实现,只是对TextWriter的简单包装而已,并没有增加其它额外的功能。我目前实在还是想不明白为什么要这样做?
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述