我真的在这件事上苦苦挣扎了几天。
我已将VS2010中的asp.net 3.5项目迁移到asp.net 4项目。一切都运作良好几周。
不知怎的,几天后我发现了一个奇怪的错误。澄清这个项目的样子:
应用
这是一个基于UserControl的应用程序,应用程序区域由嵌套的UserControl层次结构组成,它们在OnInit()
中加载子控件,以使事件系统正常工作。
(注意:VS2008和.net 3.5中的一切都很棒!)
错误
现在,当我开始调试VS2010中的webapplication时,有时会(!!!)抛出HttpException,并显示以下消息:
文件监控的文件名无效。
在LoadControl()
< - 现在它变得有趣了,LoadControl的参数是一个〜/前缀的UserControl-Path例如。 〜/ Controls / Home / Partial.ascx但是在例外情况下,它在控制目录中的某个位置显示为目录。
VS可能会使用这种方法来内部跟踪已更改的文件以重新加载?
有没有人遇到同样的问题?如果是的话,有没有解决方案?
编辑:部署Web应用程序时,错误消失。它只在调试时发生。我目前在debug->例外菜单中禁用了HttpExceptions。但我也很高兴再次抓住这些......
答案 0 :(得分:28)
错误最终再次发生,但现在我发现你可以通过恢复选项中的Enable Just My Code
选项来解决问题:Tools->Options->Debugging->General
实际上最初引入了破坏的调试行为。< / p>
必须设置选项Enable Just My Code
。
答案 1 :(得分:1)
我也有这个问题,并且已经在VS中检查了Enable Just My Code
。但是,在取消选中该选项,保存设置,然后重新检查后,问题就会消失。
答案 2 :(得分:0)
这是一个需要使用反射的解决方案,这意味着网站应该在“完全信任”下运行
using System;
using System.Reflection;
namespace Composite
{
internal static class BuildManagerHelper
{
/// <summary>
/// Gets a user control. Prevents an exception that appears in Visual Studio while debugging
/// </summary>
/// <param name="virtualPath"></param>
/// <returns></returns>
public static Type GetCompiledType(string virtualPath)
{
try
{
DisableUrlMetadataCaching(true);
return System.Web.Compilation.BuildManager.GetCompiledType(virtualPath);
}
finally
{
DisableUrlMetadataCaching(false);
}
}
/// <summary>
/// Disabling the "url metadata caching" prevents <see cref="System.Web.HttpException" /> in debugger
/// </summary>
/// <param name="disableCaching"></param>
public static void DisableUrlMetadataCaching(bool disableCaching)
{
#if DEBUG
var systemWeb = typeof (System.Web.TraceMode).Assembly;
Type cachedPathData = systemWeb.GetType("System.Web.CachedPathData", false);
if (cachedPathData == null) return;
FieldInfo field = cachedPathData.GetField("s_doNotCacheUrlMetadata", BindingFlags.Static | BindingFlags.NonPublic);
if (field == null) return;
field.SetValue(null, disableCaching);
#endif
}
}
}
P.S。多年来我一直有这个问题