几年来,我的网站非常间歇地抛出以下异常:
具有相同ID的多个控件 找到'ctl00 $ ctl00 $ ctl34'。跟踪 要求控件具有唯一性 的ID。
at System.Web.TraceContext.AddNewControl(String id,String parentId,String type, Int32 viewStateSize,Int32 controlStateSize)
at System.Web.UI.Control.BuildProfileTree(String parentId,Boolean calcViewState)
....等(整个堆栈跟踪在System.Web命名空间内)
在 System.Web.HttpApplication.ExecuteStep(IExecutionStep 步,布尔& completedSynchronously)
有时用户会转到某个页面并抛出此异常 - 它发生在不同的页面上,并显示不同的控件ID。通常,重新加载页面将起作用。其他时候,异常将在修复之前持续进行一些刷新。
现在我知道,当您向页面添加动态控件并且意外地在一个命名容器中使用相同的ID时,通常会发生此错误,因此我理解错误的含义。
但是在我的网站上,我没有添加动态控件。至少不是我所知道的。
我正在运行像Umbraco,Telerik和Peter Blum这样的第三方组件,他们几乎肯定会动态地将控件添加到控件树中,但是,就像我说的那样,这个错误已存在多年,主要版本所有这些模块。
异常的间歇性表明存在某种多线程时序问题或在某处使用随机数。谁知道......我无法在我的代码中找到它的原因。
所以我的问题是 - 如果整个堆栈跟踪都在.NET框架内,我怎么能去调试这个问题呢?
答案 0 :(得分:2)
根据我的经验,当您更新服务器上的页面(文件)时,首先打开 app_offline.htm ,同时某些用户尝试打开您的网站。
特别是如果您从ftp更新文件(这需要一些时间)或者只上传aspx或仅上传文件背后的代码。
因此,当您上传文件时,asp.net会触发编译,因为他在文件中找到了一些不同的文件,但由于文件未完全更新,因此编译后的dll会出现问题。
其他可能的方法是禁用编译时的优化并强制他编译大部分文件,即使我认为这个技巧对我不起作用。
<compilation optimizeCompilations="false">
希望得到这个帮助。
答案 1 :(得分:0)
听起来您正在要求排除步骤或想法。
也许其中一个可能会有所帮助:
对发生此异常的所有页面名称或URL进行编目。它是同一页吗?它是一组具有第三方控件之一的页面吗?这些页面是否混合了许多第三方控件(即Telerik和Blum)?
在事件查看器中是否有任何提示可能是罪魁祸首?
这些第三方控件中是否有任何用于记录的API?
这些第三方控件的API是否允许命名中的任何“帮助”,种子或约定?
将ASP.NET 4's New ClientIDMode Property视为可能的潜在解决方案。我想这应该由供应商实施。也许在测试环境中将您的应用程序转换为.NET 4,看看是否可以再现?我怀疑,因为它本质上是随机的,你可能无法预测地重现这个问题。
答案 2 :(得分:0)
如果要动态创建数据绑定控件,请在调用DataBind()方法之前确保将它们添加到页面或控件页面上。