asp.net - 无法转换为[B];相同的上下文(默认);不同的临时文件

标签 asp.net iis .net-4.0

我很难找到为什么以下错误正在发生。我将在错误描述下方概述令人困惑的方面。

[A] ASP.common_resultmessagepanel_ascx 无法转换为[B] ASP.common_resultmessagepanel_ascx

类型源自“App_Web_resultmessagepanel.ascx.38131f0b.2c4hpv_z,版本= 0.0.0.0,区域性=中性,PublicKeyToken =空”
位置中“默认” 上下文中的
'C:\Windows\Microsoft.NET\Framework\v4.0.30319\临时ASP.NET文件\MyWebApp\dc3e0df6\ba1606c8\App_Web_resultmessagepanel.ascx.38131f0b.2c4hpv_z.dll”。

类型B 源自“App_Web_wz3shqfq,版本= 0.0.0.0,区域性=中性,PublicKeyToken =空”
位置中“默认”
上下文中的
'C:\Windows\Microsoft.NET\Framework\v4.0.30319\临时ASP.NET文件\MyWebApp\dc3e0df6\ba1606c8\App_Web_wz3shqfq.dll”。

错误中引用的类是从System.Web.UI.UserControl继承并实现System.Web.UI.ITextControl的Web用户控件。该控件已注册并在母版页上使用。 parent 版页或实现页都没有控件实例。类和标记页面都在Web应用程序项目中。异常不是由应用程序代码直接导致的,而是在内部.NET Framework代码执行期间发生的。该项目是一个Web应用程序,而不是一个网站。该Web应用程序被编译成一个二进制文件,而特定于文化的资源则被编译成每个文化文件一个二进制文件。

在异常中为每种类型报告的上下文是相同的,但是我能够验证,在发生异常时,实际上在应用程序的“临时ASP.NET文件”文件夹中有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

假定的违规来源(皮肤文件C:\Projects\ABC.Web\App_Themes\Default\CheckBox.skin中的唯一行):
<asp:CheckBox runat="server" SkinID="FormInput" CssClass="FormLabel FormInputCheckBox" />

在这一点上,我不知道此问题是由解决方案,其配置,IIS和应用程序池引起的,还是与实际的临时文件目录本身(其中可能没有清除旧文件)相关的某些原因引起的。我已验证操作系统未在临时文件夹中建立索引。

我担心在生产环境中,应用程序池将回收或某些配置设置会更改,并导致使用重复的类定义重新创建这些临时文件,从而导致错误。如果在应用程序正确加载之前发生错误,那么每次应用程序池回收时我们都无法有人测试该应用程序并删除临时文件。因此,我需要找出导致重复的原因,但是目前我还不知道还有什么地方可以调查。

有任何想法吗?

我已经从母版页中删除了用户控件,并将其直接放入需要它并正在实现母版页的每个页面中。

到目前为止,此异常未再发生。我将再给它几天测试时间,看看它是否再次出现。

我仍然想知道为什么异常会发生。是否对IIS如何运行.net Web应用程序或如何创建临时文件有深入的了解?

新理论!

尽管这是一个带有已编译二进制文件的Web项目,但我正在运行以进行开发的IIS实例指向该项目文件夹。因此,源代码文件实际上位于Web路径中。我认为IIS可能会将源代码文件编译为单独的二进制文件,尤其是在应用程序池回收的情况下。因此,考虑到正在创建的重复临时文件和错误。

其他开发人员在Visual Studio中运行项目时遇到了错误。我不知道这将如何解释这些情况,但是我也不排除它是造成这种情况的原因。

最佳答案

我不确定您的情况如何,但是在以下情况下我会遇到这种情况:

网站项目类型,而不是Web应用程序。
/Controls文件夹,其中包含许多ascx用户控件。
/Client/Controls文件夹,其中包含其他ascx用户控件,其中一些注册并引用了/Controls用户控件。
/Controls/BadControl.ascx使用/Client/Controls/DupedControl.ascx作为子控件。

编译器在尝试将每个文件夹编译为单独的程序集时遇到循环依赖项。
/Controls/BadControl.ascx需要先编译/Client/Controls
/Client/Controls需要先编译/Controls

因此,编译器首先将DupedControl.ascx撑起并将其编译到其自己的单独程序集中。然后是/Controls,然后是仍然包含DupedControl的/Client/Controls

此时,在两个单独的程序集中有两个不同的DupedControl类型。 DupedControl.ascx(标记)指向正确的Type(在文件夹的程序集中称为TypeA),而BadControl的引用指向小型附加程序集中的重复TypeB。

当执行使用BadControl的页面时,DupedControl TypeA通过标记实例化,但是BadControl尝试将其填充到TypeB变量中,从而导致您描述的错误。

解决方案是移动ascx文件以摆脱循环引用。我不确定,但我认为也许“单页程序集”和“固定命名”选项也可以解决该问题。

话虽如此,Web应用程序项目只能编译为一个程序集,因此我认为这种循环文件夹引用是不可能的。也许问题出在其他地方。

关于asp.net - 无法转换为[B];相同的上下文(默认);不同的临时文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6797896/

相关文章:

c# - 检查字符串是否为空的最佳方法是什么?

asp.net - Application_BeginRequest() 方法中的依赖项注册

asp.net - 具有动态数据类型的 jQuery AJAX POST 对象到 ASP.Net WebMethod

php - 如何配置 PHP 以显示详细错误而不是错误 500 页面?

asp.net - 在Application_Start和Application_End中调用SqlConnection.ClearAllPools()?

.net - ApplicationInsights 遥测可以帮助诊断高 CPU 使用率问题吗?

c# - 在长时间运行的 Windows 服务中使用计时器

c# - EntityFramework 发生异常

javascript - 从带有捆绑的 View 中将 Javascript 添加到 ASP.NET/MVC 网页的标题部分?

c# - 如何在 C# .Net 4.0 中重启线程?