警告客户在应用程序池中的运行时版本不正确



我们将ASP.NET产品从.NET框架3.5转移到4.5.1,作为其中的一部分,我们的客户将需要将其应用程序池从CLR 2.0更改为4.0。

我们绝大多数客户都使用正确配置应用程序池的MSI安装。有时,我们有客户为应用程序设置其应用程序库。我们希望能够告诉他们:"嘿,您在应用程序池中选择了错误的CLR版本"。

我们在管道模式下实现了类似的成就。我们通过制作具有integratedMode的先决条件的httpmodule来做到这一点:

<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版本.config被解析。

我是否忽略了可能的东西?我们可以假设IIS版本为7.0或更高。

一个选项,您可以拥有一个仅运行模块的"默认" web.config,并且为2.0版CLR配置。它检查了应用程序池,如果一切正常,它将在默认一个上复制"真实" web.config。

如果不是,它将显示错误消息,直到正确配置应用程序为止。

最新更新