ult*_*ife 6 asp.net iis .net-4.0
我很难找到为什么发生以下错误.我将在错误描述下面概述令人费解的方面.
[A] ASP.common_resultmessagepanel_ascx无法转换为
[B] ASP.common_resultmessagepanel_ascx.
类型A源自"App_Web_resultmessagepanel.ascx.38131f0b.2c4hpv_z,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = null
",位于
"C:\ Windows\Microsoft.NET\Framework\v4.0.30319 "位置的"默认"上下文中\Temporary ASP.NET Files\MyWebApp\dc3e0df6\ba1606c8\App_Web_resultmessagepanel.ascx.38131f0b.2c4hpv_z.dll'.
类型B源自'App_Web_wz3shqfq,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = null'
在上下文'Default'位置
'C:\ Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\MyWebApp\dc3e0df6\ba1606c8\App_Web_wz3shqfq.dll".
错误中引用的类是继承自System.Web.UI.UserControl并实现System.Web.UI.ITextControl的Web用户控件.
控件已注册并在母版页上使用.父母版主页或实现页面都没有控件实例.
类和标记页都在Web应用程序项目中.
异常不会作为应用程序代码的直接结果发生,它发生在内部.NET Framework代码执行期间.
该项目是一个Web应用程序,而不是一个Web站点.
Web应用程序被编译为单个二进制文件,每个文化将文化特定资源编译为一个二进制文件.
为异常中的每个类型报告的上下文是相同的,但我能够验证当发生异常时,应用程序的Temporary ASP.NET Files文件夹中实际上有2个单独的类定义.
用户控件始终存在并在应用程序中使用,但在将用户控件添加到母版页后,异常首先开始发生.
异常不会持续发生.创建临时文件后,每次请求页面时都会发生异常.如果有任何原因导致临时文件被清除或重新创建,那么是否将再次创建重复的临时类定义/ DLL是随机的.这可能是web.config更改,回收应用程序池,有时甚至只是更新/重建的Web应用程序二进制文件.
堆栈跟踪的最后一位:
ASP.Default.__BuildControl__control35(Control ctrl) in C:\Projects\ABC.Web\App_Themes\Default\CheckBox.skin:3
System.Web.UI.ControlSkin.ApplySkin(Control control) +12
System.Web.UI.PageTheme.ApplyControlSkin(Control control) +119
System.Web.UI.Control.ApplyStyleSheetSkin(Page page) +61
ASP.masterpages_mymaster_master.__BuildControlpnlResults() in C:\Projects\ABC.Web\MasterPages\MyMaster.master:10
ASP.masterpages_mymaster_master.__BuildControl__control2(Control __ctrl) in C:\Projects\ABC.Web\MasterPages\MyMaster.master:9
System.Web.UI.CompiledTemplateBuilder.InstantiateIn(Control container) +12
System.Web.UI.MasterPage.InstantiateInContentPlaceHolder(Control contentPlaceHolder, ITemplate template) +87
Run Code Online (Sandbox Code Playgroud)
假定的违规来源(皮肤文件C:\ Projects\ABC.Web\App_Themes\Default\CheckBox.skin中唯一的一行):
<asp:CheckBox runat="server" SkinID="FormInput" CssClass="FormLabel FormInputCheckBox" />
Run Code Online (Sandbox Code Playgroud)
此时我不知道此问题是由解决方案,其配置,IIS和应用程序池引起的,还是与实际临时文件目录本身相关的内容,可能旧文件未被清除.我已经验证了操作系统没有为temp文件夹编制索引.
我担心在生产环境中,应用程序池将回收或某些配置设置将更改并导致使用重复的类定义重新创建这些临时文件,从而导致错误.每当应用程序池回收并删除临时文件时,如果错误发生直到应用程序正确加载,我们就无法测试应用程序.所以我需要找出造成重复的原因,但此时我还不知道还有什么地方可以调查.
有任何想法吗?
我已经从母版页中删除了用户控件,并将其直接放入需要它的每个页面中并实现了母版页.
到目前为止,例外并没有再次发生.我将再给它几天的测试时间,看看它是否再次出现.
我仍然想知道为什么异常发生了.任何人都深入了解IIS如何运行.net网络应用程序,或者如何创建临时文件?
新理论!
虽然它是一个带有编译二进制文件的Web项目,但我正在运行开发的IIS实例指向项目文件夹.因此源代码文件实际上在Web路径中.我认为IIS可能会将源代码文件编译成单独的二进制文件,尤其是在应用程序池回收时.因此,考虑正在创建的重复临时文件和错误.
其他开发人员在Visual Studio中运行项目时遇到错误.我不知道这会如何解释这些情况,但我也不会将其排除在原因之外.
经过一年半的时间,我们团队的开发人员间歇性地出现此错误,我终于能够收集足够的数据来得出一些结论。
该场景中导致错误的关键因素是 Web 路径中的源代码文件,以及运行应用程序的开发计算机上的可用内存不足。内存不足的情况会导致应用程序池比专用 Web 托管环境中更频繁地回收或释放内存。当包含已编译的 Web 应用程序代码的内存被释放,然后请求页面时,已编译的代码将重新加载到应用程序池内存中。由于源代码文件位于 Web 路径中,因此 .NET 会从源代码文件重新编译并重新加载到内存中。
这种情况在只部署编译后的DLL和静态文件的专用托管环境中不会发生,在我们的生产环境中也从未发生过。此外,理想情况下,专用环境中的内存使用量不应达到需要频繁回收应用程序池的程度。
Visual Studio 解决方案由多个项目组成,开发人员通常有多个 VS 实例、一个 SQL Server Mgmt 实例以及正在运行的其他杂项进程,这会导致开发计算机上的可用内存较低。可用内存越低,错误发生的频率和可靠性就越高。
要清除错误状态,应用程序池刷新/iisreset将清除内存,然后重建通常会解决问题。如果可用内存仍然较低,则问题可能会持续存在,直到有更多内存可用于运行应用程序为止。只需关闭一些应用程序或以其他方式将内存释放回操作系统就可以解决问题。
我仍然不确定为什么通过 Visual Studio 的 Web 服务器而不是 IIS 运行应用程序会出现相同的问题,但如果它以与 IIS 相同的方式处理内存,那么行为是相同的。
| 归档时间: |
|
| 查看次数: |
5345 次 |
| 最近记录: |