tag net for asp asp.net-mvc tracing

asp.net-mvc - net - razor if



Problemas de seguimiento de ASP.NET MVC (5)

Citando directamente del libro "MVC 2 en acción":

Cuando llamó a Trace.Write () en Web Forms, estaba interactuando con la clase Trace-Context. Esto existe en su ViewPage en ASP.NET MVC, pero aquí no es donde querría escribir las declaraciones de seguimiento. Cuando hayas pasado el testigo a la vista, no hay ninguna lógica allí que necesites rastrear. En su lugar, le gustaría rastrear la lógica incrustada en sus controladores. Puede tratar de aprovechar la clase TraceContext en su controlador, pero estas declaraciones nunca llegarán a la lista de mensajes en el registro de seguimiento (en su página o en Trace.axd). En su lugar, puede usar System.Diagnostics.Trace y configurar sus propios TraceListeners para inspeccionar la actividad en sus controladores. Alternativamente, puede aprovechar un marco de registro más maduro como log4net o NLog:

Depure aplicaciones ASP.NET MVC como lo haría con cualquier aplicación .NET. Sin embargo, el rastreo no ofrece tanto para MVC. En su lugar, puede apoyarse en los TraceListeners incorporados en .NET, o utilizar una buena biblioteca de registro como las mencionadas anteriormente. Otro aspecto del registro de errores es el monitoreo de la salud.

Lo siento por no responder con mis propias palabras, pero creo que esta explicación es acertada :)

Pregunta

¿Cómo consigo que la información de seguimiento de ASP.NET MVC sea consistente para el resultado de seguimiento en la página como trace.axd? Puede que solo me esté perdiendo algo obvio, por favor llámelo si lo ve.

Información de fondo para ASP.NET tradicional

Así que de vuelta en los días regulares de ASP.NET, simplemente podría agregar lo siguiente a su web.config:

<system.diagnostics> <trace> <listeners> <add name="WebPageTraceListener" type="System.Web.WebPageTraceListener, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/> </listeners> </trace> </system.diagnostics> ... <system.web> <trace enabled="true" pageOutput="true" writeToDiagnosticsTrace="true"/> ... <system.codedom> <compilers> <compiler language="c#;cs;csharp" extension=".cs" warningLevel="1" compilerOptions="/d:TRACE" type="Microsoft.CSharp.CSharpCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">

Luego podrías agregar lo siguiente en tus páginas:

HttpContext.Current.Trace.Write("Write Trace Here"); or System.Diagnostics.Trace.Write("Write Trace Here");

Y si golpea su página (es decir, localhost: 61115 / Default.aspx), obtendría una buena tabla de seguimiento con su seguimiento personalizado integrado con los eventos de la página asp.net:

aspx.page Begin Load 0.00343 0.000357 test 0.00462176 0.001192 aspx.page End Load 0.00526904 0.000018

Si se localiza localhost: 61115 / Trace.axd? Id = 0 se mantendrían los mismos resultados de seguimiento que los resultados de seguimiento en la página.

Información de fondo en ASP.NET MVC

Desafortunadamente, no puedo hacer que esto funcione en ASP.NET MVC 2.0 por razones que desconozco. Utilizo configuraciones similares de web.config como las enumeradas anteriormente. Lo que es interesante es que solo puedo obtener rastros para trabajar parcialmente. Por lo tanto, si llego a la página predeterminada de la funcionalidad equivalente (también conocido como método de acción de índice de mi homecontroller), veo todos los eventos tradicionales de la página asp.net, como preinit, precarga, prerender, etc. pero no hay un mensaje de seguimiento personalizado utilizando System.Diagnostics ni HttpContext.Trace.Write.

Sin embargo, si recurro al archivo Trace.axd? Id = 0, recibo mis mensajes de seguimiento personalizados pero no el resultado de seguimiento de eventos de la página ASP.NET. Debo estar perdiendo algo aquí que está causando esta incoherencia en la información de rastreo que veo en página frente a trace.axd (recuerde que asp.net tradicional produce resultados idénticos en página frente a trace.axd). Realmente me gustaría tener mi información de rastreo en página coherente con trace.axd (ya sea eliminando los eventos tradicionales de la página asp.net u otros medios). ¿Hay algo que este olvidando?


En lugar de usar HttpContext.Current.Trace o System.Diagnostics.Trace, intente usar Controller.HttpContext.Trace?


En realidad, ahora esto se puede hacer. Usando glimpse, puede regresar y usar Trace.Write en MVC.

http://getglimpse.com/

Solo para ASP.NET MVC 3.0 y hasta


La cita no se aplica al rastreo en filtros y acciones. Incluso entonces, no se aplica, ya que puede obtener resultados de seguimiento de OnResultExecuting. Solo es OnResultExecuted donde es demasiado tarde para obtener un resultado de seguimiento.

Solo pude conseguir que la salida de seguimiento integrada funcionara en IIS 7.5 ejecutando mi aplicación MVC 3 en Cassini; luego, el seguimiento integrado comenzó a funcionar en IIS 7.5.

Estoy investigando algunas trazas anomolias en MVC


Podría intentar usar Html.Action para que el controlador haga el seguimiento por usted. Por ejemplo, si necesita rastrear el error desde la vista de error predeterminada, puede usar

Html.Action("TraceError", "Error", new { ControllerName = Model.ControllerName, ActionName = Model.ActionName, Exception = Model.Exception })

Luego dentro de tu Error Controller, implementa el método.

public ActionResult TraceError(String ControllerName, String ActionName, Exception Exception) { System.Diagnostics.Trace.TraceError("Error Message: {0}", Exception.Message); // Other tracing statements }