5

Estoy tratando de depurar un controlador HTTP en Visual Studio y el punto de interrupción no recibe ningún golpe. ¿Alguien tiene una idea sobre cómo realizar la depuración de los controladores HTTP en Visual Studio?Depuración de un controlador HTTP de Visual Studio

estoy usando VS 2010 Premium, .NET 4.0 en una máquina Windows 7 . En mi aplicación Web Tengo un controlador HTTP en /HTTPHandler/TrackingHandler.cs

El siguiente es en mi web.config archivo:

<system.webServer> 
     <handlers> 
      <add name="TrackingHandler" path="/tx/*" verb="*" type="ProjectNamespace.TrackingHandler" resourceType="Unspecified" preCondition="integratedMode" /> 
     </handlers> 
    </system.webServer> 

Mi HTTP Handler se parece a continuación

namespace ProjectNamespace 
{ 
    public class TrackingHandler : IHttpHandler 
    { 
     public bool IsReusable 
     { 
      get { return true; } 
     } 

     public void ProcessRequest(HttpContext context) 
     { 
      //Breakpoint on the very first line below 
      string tracker = Path.GetFileName(context.Request.PhysicalPath); 
       ....... 
     } 
    } 
} 

Comienzo mi aplicación web usando cualquier página al azar en Visual Studio Debug usando el servidor web incorporado. Luego edito manualmente la URL para que apunte al directorio /tx/ y una cadena aleatoria después de ella. Por ej. mi URL actual se ve como http: // localhost: 53699/tx/sdfs. Pensé que esto debería detener el punto de interrupción en la primera línea de ProcessRequest() pero no es así.

Estaría agradecido por cualquier idea.

O. O.

Editar: Información adicional

En las propiedades del proyecto , en el Tab Web, que selecciona No abra una página. Espere una solicitud de una aplicación externa. También conseguía un System.Web.HttpException, así que fui a Depuración -> Excepciones -> Common Language Runtime y marcó la casilla junto System.Web.

El siguiente es mi seguimiento de pila. No parece estar llegando a mi controlador. ¿Lo he definido incorrectamente en mi Web config ??

> System.Web.dll!System.Web.StaticFileHandler.GetFileInfo(string virtualPathWithPathInfo, string physicalPath, System.Web.HttpResponse response) + 0x1f7 bytes  
    System.Web.dll!System.Web.StaticFileHandler.ProcessRequestInternal(System.Web.HttpContext context = {System.Web.HttpContext}, string overrideVirtualPath) + 0xc7 bytes 
    System.Web.dll!System.Web.DefaultHttpHandler.BeginProcessRequest(System.Web.HttpContext context, System.AsyncCallback callback = {Method = {System.Reflection.RuntimeMethodInfo}}, object state = null) + 0x15c bytes 
    System.Web.dll!System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() + 0x2d7 bytes  
    System.Web.dll!System.Web.HttpApplication.ExecuteStep(System.Web.HttpApplication.IExecutionStep step = {System.Web.HttpApplication.CallHandlerExecutionStep}, ref bool completedSynchronously = true) + 0xb9 bytes 
    System.Web.dll!System.Web.HttpApplication.ApplicationStepManager.ResumeSteps(System.Exception error) + 0x13e bytes 
    System.Web.dll!System.Web.HttpApplication.System.Web.IHttpAsyncHandler.BeginProcessRequest(System.Web.HttpContext context, System.AsyncCallback cb, object extraData) + 0xf8 bytes 
    System.Web.dll!System.Web.HttpRuntime.ProcessRequestInternal(System.Web.HttpWorkerRequest wr = {Microsoft.VisualStudio.WebHost.Request}) + 0x1a2 bytes 
    System.Web.dll!System.Web.HttpRuntime.ProcessRequestNoDemand(System.Web.HttpWorkerRequest wr) + 0x7d bytes 
    System.Web.dll!System.Web.HttpRuntime.ProcessRequest(System.Web.HttpWorkerRequest wr) + 0x47 bytes 
    WebDev.WebHost40.dll!Microsoft.VisualStudio.WebHost.Request.Process() + 0x17b bytes 
    WebDev.WebHost40.dll!Microsoft.VisualStudio.WebHost.Host.ProcessRequest(Microsoft.VisualStudio.WebHost.Connection conn = {System.Runtime.Remoting.Proxies.__TransparentProxy}) + 0x6c bytes 
    [Appdomain Transition] 
    WebDev.WebHost40.dll!Microsoft.VisualStudio.WebHost.Server.OnSocketAccept(object acceptedSocket) + 0x83 bytes 
    mscorlib.dll!System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(object state) + 0x2d bytes 
    mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool ignoreSyncCtx) + 0xb0 bytes  
    mscorlib.dll!System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() + 0x5a bytes 
    mscorlib.dll!System.Threading.ThreadPoolWorkQueue.Dispatch() + 0x147 bytes 
    mscorlib.dll!System.Threading._ThreadPoolWaitCallback.PerformWaitCallback() + 0x2d bytes  
    [Native to Managed Transition] 

Respuesta

3

publicar el manejador de su propia aplicación de IIS y luego attach Visual Studio para IIS y ya está listo para depurar.

Si no desea o no puede implementar en IIS (al depurar los manejadores de HTTP configuro el script Post Build para publicar el proyecto en IIS), puede depurar Cassini configurando la opción de inicio de su proyecto en 'No abrir una página' y adjuntar Visual Studio al aspnet_wp.exe.

Y no se olvide de ejecutar Visual Studio como administrador, o adjuntar no funcionará.

+0

Gracias. No pude encontrar ** aspnet_wp.exe ** en la lista de procesos. Intenté iniciarlo en VS con la opción _ "No abrir una página" _ como se menciona en la edición de mi pregunta original. Desde el rastro de la pila, creo que ni siquiera está entrando en mi código. Siempre estoy ejecutando VS como ** admin **. –

+0

AttachTo addin no es compatible con VS.NET 2015 –

1

Cuando falla todo lo demás, puede generar un debug interrupt en su aplicación con DebugBreak(), __debugBreak(), o _asm int 3. Cuando esto se ejecuta y tiene instalado MSDev, debe obtener un cuadro de diálogo que le preguntará si quiero terminar o depurar. Esto le permite ejecutar ahora y adjuntarlo más tarde, y funciona sin que tenga que saber a qué adjuntarlo.

+0

@ tbroberg: ¿Dónde pongo ** DebugBreak() **? No funciona en la primera línea de ** ProcessRequest() **. (No pude obtener ** DebugBreak() ** para compilar. Supongo que esto es solo para C++, mientras estoy usando C#. En su lugar utilicé ** Debugger.Launch(); Debugger.Break(); ** - pero esto no funcionó.) –

+0

Ah, C#. Ver este [tema relacionado] (http://stackoverflow.com/questions/104235/how-can-i-use-debugbreak-in-c) – tbroberg

1

Los puntos de interrupción se verán afectados si adjunta el proceso (por ejemplo, w3wp.exe) desde las herramientas de opción-> Adjuntar para procesar y seleccionar el proceso deseado.

Cuestiones relacionadas