我们正在将ASP.NET产品从.NET Framework 3.5迁移到4.5.1作为其中的一部分,我们的客户需要将其应用程序池从CLR 2.0版更改为4.0。
我们的绝大多数客户使用正确配置应用程序池的MSI进行安装。有时,我们有客户手动为应用程序设置应用程序池。我们希望能够告诉他们,“嘿,您在应用程序池中选择了错误的CLR版本”,使用产品本身。
我们为管道模式实现了类似的功能。我们通过制作一个前提条件为integratedMode
:
<system.webServer>
<modules>
<add preCondition="integratedMode" name="IisPipelineCheckModule" type="IisPiplineCheckModule, OurAssembly, Culture=neutral, PublicKeyToken=ba36f1f458df13fd" />
</modules>
所有这些HTTP模块都会吐出一个HTML页面,指示他们将AppPool更改为经典管道(我们需要):
application.Response.ClearContent();
application.Response.ContentType = "text/html";
application.Response.WriteFile(application.Server.MapPath("~/pipeline.htm"));
application.Response.End();
我们尝试通过添加2.0的运行时版本前提条件来执行类似的操作,以指示客户将运行时版本更改为4.0:
<add preCondition="runtimeVersionv2.0" name="IisNetFxCheckModule" type="NetFxVersionCheckModule, SomeAssemblyCompiledFor20Clr, Culture=neutral, PublicKeyToken=ba36f1f458df13fd" />
不幸的是,这有几个问题。如果AppPool设置为CLR 2.0不正确,它甚至无法解析web.config,因为它可能包含4.0的新元素和属性,例如<httpRuntime requestValidationMode="2.0" />
。在它甚至接近执行HttpModule之前,它会爆炸。同样,如果“bin”包含为4.0 CLR编译的程序集,则会有程序集加载异常,指示程序集是为较新版本的运行时构建的。
我认为我正在寻找的东西是不可能的,我们没有办法在应用程序的生命周期中尽早解开警告错误的CLR版本,甚至在bin甚至探测到程序集或web之前.config被解析。
有什么我忽略了可能的地方吗?我们可以假设IIS版本为7.0或更高版本。
答案 0 :(得分:0)
一个选项,你可以有一个&#34;默认&#34; web.config仅运行您的模块,并且已针对2.0版clr进行了配置。它检查应用程序池,如果一切正常,它会复制&#34;真正的&#34; web.config超过默认值。
如果不是,则会在正确配置应用程序池之前显示错误消息。