VS 2010调试失败:HttpException在LoadControl中进行文件监视的文件名无效

时间:2010-08-25 11:20:46

标签: asp.net visual-studio-2010

我真的在这件事上苦苦挣扎了几天。

我已将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。但我也很高兴再次抓住这些......

3 个答案:

答案 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。多年来我一直有这个问题