正在加载中...

.net CLR运行环境影响session有效期(登录频繁超时退出)问题解决方法

.net CLR运行环境影响session有效期(登录频繁超时退出)问题解决方法

也许你在windows+IIS+ASP/ASP.NET开发过程中遇到session很快超时退出的问题,会员刚登录不久,很快就退出,很是烦人。经过仔细的研究,万维景盛工程师发现,session登录频繁超时与进程程序池.net CLR运行环境有关。通过查看错误日志发现,每次退出,都会出现以下错误日志:

.NET Runtime version 4.0.30319.0 - 由于下面的环境变量设置,加载了针对旧版本的 CLR 而设计的探查器。在许多情况下,较旧的探查器将继续工作,但如果您遇到了问题,请考虑升级探查器或更改此环境变量的设置。有关如何使用此环境变量以及与之相关的风险的信息,请参考相关文档。环境变量设置: ProfAPI_ProfilerCompatibilitySetting=EnableV2Profiler。探查器 CLSID:“{9598F6D3-9CAA-46BF-A995-0AA1D18A547A}”。  进程 ID (十进制): 5688。消息 ID: [0x2518]。

而相关的程序并不是.net开发,那么怎么会存在.net运行时错误呢?

原来,这是因为进程程序池用到了.net托管,将asp运行有.net环境中,随着.net报错,asp程序也会故障。

看提示,4.0的探测器提示已设置为2.0,尝试将程序池改为.net CLR 2.0,观察一段时间,发现session登录超时问题消失。

探查器兼容性设置

.NET Framework (current version)


默认情况下,在 .NET Framework 4中,公共语言运行时 (CLR) 仅加载和使用针对 .NET Framework 4 生成的探查器。 除非明确指定,否则 CLR 不加载或运行已为 .NET Framework 2.0、3.0 或 3.5 版本构建的探查器。(在本主题中,术语“2.0 版探查器”是指为 .NET Framework 2.0、3.0 和 3.5 版本构建的探查器。)

探查器用户必须通过使用 COMPLUS_ProfAPI_ProfilerCompatibilitySetting 环境变量来明确选择使用 2.0 版探查器。 .NET Framework 4 中使用的 2.0 版探查器按如下方式运行:

  • .NET Framework 2.0 版分析 API 仍可按照 2.0 版文档中所述的方式在 .NET Framework 4 中正常工作。

  • .NET Framework 4 中不会对未记录的 2.0 版分析 API 或 CLR 行为予以保证。 不能保证依赖于未记录的行为的 2.0 版探查器可在 .NET Framework 4 中正常工作。请注意,此兼容性设置不提供与 CLR 2.0 行为的向后兼容。

COMPLUS_ProfAPI_ProfilerCompatibilitySetting

在设置 COMPLUS_ProfAPI_ProfilerCompatibilitySetting 环境变量之前,必须设置 COR_PROFILER 或COR_ENABLE_PROFILING 环境变量。 (有关说明,请参见设置分析环境。)

可以将 COMPLUS_ProfAPI_ProfilerCompatibilitySetting 环境变量设置为下表所示的三个值之一。

说明 说明

在 .NET Framework 版本 3.5 和更低版本中,CLR 不支持 COMPLUS_ProfAPI_ProfilerCompatibilitySetting 变量。 如果已设置 COR_PROFILER 或 COR_ENABLE_PROFILING 环境变量,则 CLR 始终会尝试加载探查器。

设置

CLR 行为

EnableV2Profiler

加载和激活 2.0 版探查器。

DisableV2Profiler

禁用 2.0 版探查器,但不卸载它们。 .NET Framework 4 探查器不会受到影响。 此设置为默认设置。

PreventLoad

无论为其编写探查器的 .NET Framework 的版本如何,都不会加载任何探查器。

详细的行为如下:

  • EnableV2Profiler

    无论为其编写探查器的 .NET Framework 的版本如何,.NET Framework 4 CLR 都会加载并使用可用的探查器。 在进程内并行分析中,如果 .NET Framework 版本 2.0 CLR 首先在进程中加载一个探查器,则 .NET Framework 4 CLR 不会重新加载该 2.0 版探查器。

  • DisableV2Profiler(默认值)

    .NET Framework 4 CLR 加载探查器,并通过调用探查器的 IUnknown::QueryInterface 方法查找 ICorProfilerCallback3 接口来确定探查器的版本。 

    • 如果探查器实现 ICorProfilerCallback3,则探查器为 .NET Framework 版本 4 探查器,并且 CLR 将继续使用它。

    • 如果探查器未实现 ICorProfilerCallback3,则探查器为 2.0 版探查器。 在此情况下,CLR 会释放探查器接口,且不会激活探查器。 不过,由于 CLR 未卸载探查器 DLL,因此它可以保持与未卸载探查器 DLL 的 .NET Framework 版本 2.0 CLR 的向后兼容性。 (请注意,.NET Framework 4 探查器在分离或关闭时确实会被卸载,因此,若要修改 .NET Framework 4 的探查器,则必须更改此行为。)

  • PreventLoad

    .NET Framework 4 CLR 完全忽略探查器。 此设置对于某些进程内并行方案很有用。 有关更多信息,请参见进程内并行分析

例如,若要指示 CLR 加载 .NET Framework 2.0 探查器,请打开命令提示符窗口并键入以下内容:

set COMPLUS_ProfAPI_ProfilerCompatibilitySetting=EnableV2Profiler
说明说明

此兼容性开关只会影响探查器启动路径。 对于附加-加载探查器,运行时对 ICorProfilerCallback3 接口调用 IUnknown::QueryInterface 函数。 如果探查器未实现此接口(此情况适用于 2.0 版探查器),则运行时不会加载探查器,并会在事件日志中记录探查器加载失败项。



返回上一页