2010-08-25 13 views
21

Realmente he estado luchando durante días sobre este asunto.VS 2010 falla la depuración: HttpException nombre de archivo no válido para la supervisión de archivos en LoadControl

He migrado un proyecto asp.net 3.5 en VS2010 a un proyecto asp.net 4. Todo funcionó bien por varias semanas.

De alguna manera, me sale un extraño error desde hace unos días. Para aclarar lo que se ve este proyecto como:

La aplicación

Es una aplicación basada en control de usuario y las áreas de aplicaciones se componen de anidados jerarquías UserControl, que cargan a sus hijos controles en OnInit(), con el fin de obtener el evento sistema para trabajar.

(Nota: todo funciona muy bien en VS2008 y .NET 3,5)

El error

Ahora cuando comienzo la depuración de la aplicación web en VS2010, a veces (!!!), un HttpException es lanzado, con el mensaje:

Nombre de archivo no válido para la supervisión de archivos.

en LoadControl() < - y ahora se pone interesante, el parámetro para LoadControl es un ~/prefijado UserControl-Path por ejemplo. ~/Controls/Home/Partial.ascx PERO en la Excepción se muestra como un Directorio, en algún lugar del Directorio de Controles.

Probablemente VS utiliza un enfoque de este tipo para rastrear internamente los archivos cambiados para volver a cargarlos.

¿Alguien ha tenido el mismo problema? Si es así, ¿ha habido alguna solución?

Editar: al implementar la aplicación weba, el error desaparece. Solo ocurre cuando se depura. Actualmente he desactivado HttpExceptions en el menú de depuración-> excepciones. Pero estaría muy contento de volver a verlos también ...

+0

¿Alguna vez resolvió esto? Me estoy encontrando con lo mismo. –

Respuesta

27

El error finalmente volvió a suceder, pero ahora descubrí que puede eludir el problema invirtiendo la opción Enable Just My Code en Opciones: Tools->Options->Debugging->General, que de hecho originalmente había introducido el comportamiento de depuración roto

Se debe configurar la opción Enable Just My Code.

0

Aquí es una solución que requiere el uso de la reflexión, eso significa que el sitio web debe estar en ejecución en "plena confianza"

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. Tuve este problema durante muchos años

+0

¿Cómo se integra esto en su aplicación? –

1

Tuve este problema también, y ya tenía Enable Just My Code registrado en VS. Sin embargo, después de desmarcar la opción, guardar la configuración y volver a verificarla, el problema desapareció.

Cuestiones relacionadas