使用ClientBuildManager.CompileFile进行就地编译
我正在开发一个我想使用就地编译的网站,以便让第一次点击更快。 我想使用ClientBuildManager
。 CompileFile
方法进行就地编译,这样我就可以控制编译过程。 由于各种原因,这是编译本网站的理想方式。
为什么IIS在“临时ASP.NET文件”下构建到不同的子目录?
当我通过ClientBuildManager
按文件编译网站文件时。 在为此目的构建的exe中的CompileFile
方法,输出转到“临时ASP.NET文件”下的子目录。 但是,当以后点击网站时,IIS会在“临时ASP.NET文件”下的不同子目录下重建控件,使之前的就地编译变得毫无价值。
注意 :在“临时ASP.NET文件”下的就地编译期间创建的程序集将保持不变(仍然存在)。
注意 :就地编译程序集文件夹和IIS生成的程序集文件夹都位于相同的“Temporary ASP.NET Files”目录下。
例:
- C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Temporary ASP.NET Files \ root \ 2ba591b9 \ [ 就地编译文件夹名称 ]
- C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Temporary ASP.NET Files \ root \ 2ba591b9 \ [ IIS为网站生成程序集 ] \
ClientBuildManager
。 CompileFile
配置
var buildParameter = new ClientBuildManagerParameter { PrecompilationFlags = PrecompilationFlags.Default, }; var clientBuildManager = new ClientBuildManager( RootVirtualPath, RootPhysicalPath, null, buildParameter); ... clientBuildManager.CompileFile(relativeVirtualPath, callback);
RootVirtualPath
只是默认网站的“”。 RootPhysicalPath
指向网站磁盘上的位置。 relativeVirtualPath
的格式为“〜/ myFile.aspx”。 回调用于跟踪进度。
我认为你所看到的实际上与使用CompileFile
和PrecompileApplication
无关。 即如果你做同样的事情,但调用PrecompileApplication()
,你仍然会得到一个文件夹不匹配。
请注意,从技术上讲,您没有正确创建CBM对象。 调用它的正确方法是依靠IIS信息来定位文件。 去做这个:
- 传递
/LM/W3SVC/7/ROOT/
等appVirtualDir
- 为
appPhysicalSourceDir
传递null
请注意,’7’只是一个例子。 要获得正确的数字:
- 运行inetmgr
- 转到站点的高级设置
- 找到站点ID。 这是你想要的数字
/LM/W3SVC/ID/ROOT/
我正在为记录解释这个,因为不幸的是,即使以这种方式我也无法使文件夹匹配。 这种情况可能只是在ASP.NET中被破坏了(它曾经工作过!)。
另一种可能性是服务器端。 例如
- 在您的站点中包含一个页面,用于触发选择性预编译。
- 在那里,调用
BuildManager.GetCompiledType("~/myfile.aspx")
,以及对要预编译的每个页面(或用户控件等)的类似调用。 - 如果要触发自定义预编译,只需请求该页面
当然,还有一种低技术替代方案,即只需要提前编辑您想要编辑的页面来预热您的网站。
山姆,答案是David Ebbo的回答和原始代码之间的交叉。
var buildParameter = new ClientBuildManagerParameter { PrecompilationFlags = PrecompilationFlags.Default, }; var clientBuildManager = new ClientBuildManager( RootVirtualPath, RootPhysicalPath, null, buildParameter); ... clientBuildManager.CompileFile(relativeVirtualPath, callback);
如果您执行David Ebbo所说的内容并在构造ClientBuildManager时将其用于RootVirtualPath:
/LM/W3SVC/7/ROOT/
然后你必须为RootPhysicalPath传入null。
这应该摆脱其余的问题,它应该构建到IIS正在寻找的同一目录。
- 以编程方式更新ClickOnce应用程序的部署清单会导致缺少元素,这在4.0中是必需的
- Windows Forms WebBrowser控制.net 4.0框架上的错误
- TreatControlCAsInput问题。 这是一个错误吗?
- 这是ConcurrentDictionary和ConcurrentQueue线程安全的组合吗?
- 使用.net 4.0测试程序集测试.net 3.5程序集时的风险有多大
- 什么是“C#编译器作为服务”的状态
- 使用Socket.BeginAccept / EndAccept进行多个连接
- 为什么Path.Combine会使用相对路径生成此结果?
- 无法使用html5“date”类型写入asp.net文本框控件