VS 2010 не удается отладить: HttpException недопустимое имя файла для контроля файлов в LoadControl
Я действительно много дней боролся с этим вопросом.
Я перенес проект asp.net 3.5 в VS2010 в проект asp.net 4. Все работало нормально в течение нескольких недель.
Как-то, я получаю странную ошибку с нескольких дней. Чтобы прояснить, как выглядит этот проект:
Приложение
Это приложение на основе UserControl и области приложения состоят из вложенных иерархий UserControl, которые загружают свои дочерние элементы управления в OnInit()
, чтобы заставить систему событий работать.
(Примечание: все отлично работает в VS2008 и .net 3.5!)
Ошибка
Теперь, когда я начинаю отладку web-приложения в VS2010, иногда (!!!), вызывается HttpException, с сообщением:
Недопустимое имя файла для мониторинга файлов.
in LoadControl()
< - и теперь он становится интересным, параметр LoadControl является ~/префиксом UserControl-Path, например. ~/Элементы управления/Главная/Partial.ascx, но в Exception он отображается как каталог, где-то в каталоге управления.
Вероятно, VS использует такой подход для внутренней отслеживания измененных файлов для перезагрузки?
Кто-нибудь сталкивался с той же проблемой? Если да, были ли какие-либо решения?
Изменить: при развертывании веб-приложения ошибка исчезает. Это происходит только при отладке. В настоящее время я отключил HttpExceptions в меню debug- > exceptions. Но я был бы очень рад снова их поймать.
Ответы
Ответ 1
Ошибка в конечном итоге произошла снова, но теперь я обнаружил, что вы можете обойти проблему, возвращая опцию Enable Just My Code
в Options: Tools->Options->Debugging->General
, которая на самом деле первоначально ввела нарушение режима отладки.
Параметр Enable Just My Code
должен быть установлен.
Ответ 2
У меня тоже была эта проблема, и я уже проверил Enable Just My Code
в VS. Однако после снятия отметки с опции, сохранения настроек, а затем повторной проверки, проблема исчезла.
Ответ 3
Здесь решение, которое требует использования рефлексии, означает, что веб-сайт должен работать под "Полный доверие"
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. У меня была эта проблема в течение многих лет.