Archivos para la Categoría 'ASP.NET'

24
Jun
08

Depurando con un HTTP Handler (*. ashx)

Fuente Original : 15 Seconds

Un manejador se encarga de cumplir las peticiones de un navegador.Pide un navegador que se maneja ya sea manejado por extensión de archivo (o falta de ella) o llamando directamente el manejador. Sólo un manejador puede ser llamado por solicitud. Un manejador no tiene todo el código HTML de texto como. ASPX o. Ascx archivos. Un manejador es una clase que implementa la interfaz IHttpHandler. Si se necesita interactuar con cualquier reunión de información, usted también tendrá que aplicar la interfaz IRequiresSessionState, Si desea hacer una manejador asincrono, tendrá que aplicar la IHttpAsyncHandler interfaz en lugar de la interfaz IHttpHandler.

Llamando al Handler

Un manejador puede ser invocado por cualquier extensión de archivo que está asignada a través del web.config IIS y la extensión de archivo asignaciones, Puedes encontrar un archivo llamado something.billybob donde “billybob ‘es la extensión de archivo, o bien puede no tienen extensión de archivo a todos como http://web/handler/file cuando una petición de’ archivo ’sin una extensión invoca una manejador asignado a *.* o el directorio como *.

Cómo llamar a un manejador de directorio

El fichero de código para el manejador tiene la extensión de archivo de ‘ashx’ en el servidor web. Este archivo puede ser llamado directamente a través de un navegador, sin tener que configurar web.config o IIS asignaciones de extensión de archivo Por ejemplo: http://web/handler/handler.ashx. Algunos ejemplos de este tipo son handler álbumes de fotos, titulares RSS, blogs y sitios web. Cada uno de estos es un buen ejemplo de trabajo que puede ser mejor realizado sin estándar HTML. Un álbum de fotos directorio implica el rastreo y la respuesta con fotos. Un feed RSS devuelve la información en el formato correcto.

Trace.axd como Ejemplo Handler

Un ejemplo de un manejador que se invoca por extensión de archivo es el archivo Trace.axd utilizado para depurar. Con el fin de invocar el manejador de Trace.axd, puede configurar el sitio web de rastreo mediante la adición de una sección para localizar web.config:

y llamar a la trace.axd archivo de la raíz del sitio web como http://localhost/trace.axd.

Requerido asignaciones de IIS para Manipuladores de llamada por extensión de archivo
Manipuladores de que se invoquen sobre la base de una solicitud de extensión de archivo de configuración requieren en web.config y en el IIS extensión de archivo de mapas.Con el fin de ver el archivo de cartografía de la *. axd archivo, abra el Administrador de IIS y configurar la aplicación. Go to the ‘Mappings’ tab and scroll down until you see the .axd file extension. Volver a las’ asignaciones’ y desplácese hacia abajo hasta que vea el. Axd extensión de archivo.

Haga doble clic sobre el archivo. Axd extensión con el fin de ver más detalles acerca de este mapeo.

La invocación de los manipuladores de extensión de archivo o extensión no le da la flexibilidad acerca de lo que se llama y cuándo. Hay muchos artículos en la web sobre extensión de archivo para que los manipuladores de este artículo se centrará en el manejador que se llama directamente

La creación de un Handler
Con el fin de crear un manejador de archivos de código, usted necesita un sitio web en Visual Studio 2005 (o Visual Studio 2003 para un archivo. Manejador NET 1.x). Por un nuevo sitio web, selecciona “ASP.NET Web Site”.

Esto creará un sitio web con un directorio App_Data y el archivo default.aspx.Usted no va a usar la default.aspx para que puedas salir de él, ya sea solos o borrarlo.

Usted tendrá que crear el web.config y el manejador de archivo, haga clic en el sitio web en el Explorador de soluciones y agregar nuevos temas de “web.config” y “Generic Handler».

El codigo del manejador se vera asi :

using System;
using System.Web;

public class Handler : IHttpHandler {

public void ProcessRequest (HttpContext context) {
context.Response.ContentType = “text/plain”;
context.Response.Write(“Hello World”);
}

public bool IsReusable {
get {
return false;
}
}

}

En este punto, construir el proyecto y establecer el handler.ashx archivo como el archivo de inicio. Iniciar condebugging. Se le pedirá permitir que el proceso para cambiar su web.config para permitir la depuración. A menos que quiera escribir en el cambio de permitir la depuración de ti mismo ( “”), aceptar este cambio

Handler.ashx
El archivo handler.ashx implementa la interfaz IHttpHandler y dispone de dos métodos ‘ProcessRequest’ y ‘IsReusable’ , El ‘ProcessRequest’ es su principal método en donde se colocara su código
El ‘IsReusable’ este método es true por defecto e indica si otra solicitud puede usar el ejemplo IHttpHandler. Si el ejemplo se puede reutilizar se deja en true – esto mejorará la velocidad del manejador, y reducir el trabajo que tendra que hacer su servidor . Pero si su ejemplo no debería ser reutilizado, debido al estado o porque es ansychronous, debe configurar IsReusable a false.

Estado de Sesión

Antes de continuar, debera de aplicar la intefaz IRequiresSessionSate en el archivo handler.ashx, Si necesita acceso de sólo lectura para el período de sesiones, tendra que aplicar la interfaz IReadOnlySessionState, Ambas interfaces se encuentran en la System.Web.SessionState Espacio de nombres que usted tendrá que añadir. El código debería tener el siguiente aspecto:

using System;
using System.Web;
using System.Web.SessionState;

public class Handler : IHttpHandler , IReadOnlySessionState{

public void ProcessRequest (HttpContext context) {
context.Response.ContentType = “text/html”;
context.Response.Write(“Hello World”);
}

public bool IsReusable {
get {
return false;
}
}

}

Establezca un Break Point para la primera línea en la clase y comenzar de nuevo la depuración

Manejo de Problemas con Debug Build
Cuando usted usa una Debug Build, usted tiene todos los recursos del depurador de Visual Studio, todos Espacios de nombres del . NET Framework, y cualquier sistema de utilidades y aplicaciones. El Visual Studio Debugger le permite ver la pila de llamada, las variables locales, variables de cualquier reloj, etc Usted probablemente está familiarizado con el uso de estas características en cierta medida. Sin embargo, con un HTTP Handler, la depuración es mucho más importante porque la única indicación visual de un error en el contenido se encuentra en el codigo.

Manejo de Problemas con un Release Build
es diferente de la depuración construir en ambas funciones y el rendimiento. Cuando usted está utilizando el Release Build es, probablemente, en un entorno de producción Como tal, tendrá que utilizar un conjunto diferentes herramientas para encontrar sus temas.

Depurando con el Espacio de Nombres System.Diagnostics
tiene muchas clases para ayudar con la depuración en la liberación y el modo de depuración, Si usted está en libertad de depuración en modo de espera, usted debe usar la clase Trace. Si está de depuración en el modo de depuración, debe usar la clase Assert. Este artículo no cubre todas las habilidades de este espacio de nombres por lo que debería investigar qué clase le ayudará a resolver su problema inmediato.

Con el fin de mostrar estas clases en la acción, cambie el código para utilizar el Espacio de Nombre y utilizar un bucle infinito, La afirmación es tirar cuando la expresión en la afirmación es falsa, por lo que la afirmación va a lanzar cuando el contador ya no es inferior a 10.

using System;
using System.Web;
using System.Web.SessionState;
using System.Diagnostics;

public class Handler : IHttpHandler , IReadOnlySessionState{

public void ProcessRequest (HttpContext context) {

context.Response.ContentType = “text/html”;
context.Response.Write(“Hello World”);

int i=0;

while (1!=0)
{
Debug.Assert(i<10);
i++;
}

}

public bool IsReusable {
get {
return false;
}
}

}

Construir y depuración. Dado que no hay interrupción conjunto, el depurador se activarán de nuevo cuando la afirmación se ve afectado. Esto es muy útil si usted sabe lo que es el error que está recibiendo y puede hacer una prueba para él. Lo primero que ocurre es una afirmación ventana con información acerca de la afirmación. Si quieres ver a las condiciones previas y, a continuación parada en el error, puede combinar estas dos declaraciones para acelerar su proceso de depuración. Un ejemplo de ello es el código a continuación:

public class Handler : IHttpHandler , IReadOnlySessionState{

public void ProcessRequest (HttpContext context) {

context.Response.ContentType = “text/html”;
context.Response.Write(“Hello World”);

Debugger.Break();

int i=0;

while (1!=0)
{
Debug.Assert(i<10);
i++;
}
}

public bool IsReusable {
get {
return false;
}
}

}

Puede utilizar la Debug.Write, Debug.WriteIf, Debug.WriteLine, y Debug.WriteLineIf para imprimir a la ventana de salida durante un período de sesiones de depuración. Esto podría ayudarle a ver el estado del HTTP Handler.

Si desea localizar un problema en construir una liberación, tendrá que haber una forma de peering en el código. forma de hacerlo es añadir EventLog.WriteEntry declaraciones en su código. Esto le permite añadir información al registro de eventos como el HTTP Handler está en marcha. El método WriteEntry está muy sobrecargado por lo que tendrá que determinar el mejor método para su uso. Si quieres ver la información como una simple entrada de información en caso espectador, que acaba de utilizar un argumento String El Visor de eventos necesita saber la “Fuente” del evento, así que el nombre de “HTTPHandler – DebugArticle”. Esto debería ser fácil de ver en el Visor de eventos.

using System;
using System.Web;
using System.Web.SessionState;
using System.Diagnostics;

public class Handler : IHttpHandler , IReadOnlySessionState{

public void ProcessRequest (HttpContext context) {

context.Response.ContentType = “text/html”;
context.Response.Write(“Hello World”);

int i=0;

// Crear una EventLog instancia y ceder su lugar de origen.
EventLog myLog = new EventLog();
myLog.Source = “HTTPHandler-DebugArticle”;

while (i<100)
{
if (i/10==0)
{
// Escribir una entrada de información para el registro de sucesos.
myLog.WriteEntry(“Writing to event log: i is divisible by 10.”);
}
i++;
}

}

public bool IsReusable {
get {
return false;
}
}

}

Construir una versión del manejador y lo llaman. La salida sólo debería incluir el “Hola Mundo” texto. Abra el Visor de eventos, solicitud de registro Usted debe ver varios anuncios de la fuente de “HTTP Handler – DebugArticle”.

Si abre uno de los eventos, debería ver una simple salida:

También hay clases para interactuar con el monitor de rendimiento y procesos, así como varias clases para ayudar con la lógica de flujo

Otro método de búsqueda de sus problemas es atribuir a un proceso que contiene el HTTP Handler Si está ejecutando varios sitios web donde cada sitio web se encuentra en su propio proceso de espacio, puede que tenga que averiguar el identificador de proceso. La forma más fácil es que sel manejar me lo diga. Los nombres System.Diagnostics incluye una clase llamada Proceso que le ayudará a determinar el actual proceso de identificación. Con el fin de encontrar la id, vamos a enviar el id al evento visor de cambiar el código a:

using System;
using System.Web;
using System.Web.SessionState;
using System.Diagnostics;

public class Handler : IHttpHandler , IReadOnlySessionState{

public void ProcessRequest (HttpContext context) {

context.Response.ContentType = “text/html”;
context.Response.Write(“Hello World”);

int i=0;

Process.GetCurrentProcess().Id.ToString();

// Create an EventLog instance and assign its source.
EventLog myLog = new EventLog();
myLog.Source = “HTTPHandler-DebugArticle”;
myLog.WriteEntry(“Process Id is ” + Process.GetCurrentProcess().Id.ToString());

while (i<100)
{
if (i/10==0)
{
// Write an informational entry to the event log.
myLog.WriteEntry(“Writing to event log: i is divisible by 10.”);
}
i++;
}

}

public bool IsReusable {
get {
return false;
}
}
}

La línea de código importante aquí es en el bucle y es una alteración a la cadena en la myLog.WriteEntry: Process.GetCurrentProcess (). Id. La siguiente figura muestra lo que el Visor de eventos de entrada tiene el siguiente aspecto

Ahora que sabes el proceso de identificación, usted necesidad de encontrar este identificador en el Administrador de Tareas. Con el fin de ver proceso de identificaciones en el Administrador de tareas, haga clic en la pestaña de procesos a continuación, haga clic en Ver y elija Seleccionar columnas. Haga clic en el PID (Process Identifier) Aceptar y de los diálogos La lista de procesos debe incluir ahora el PID, que se puede clasificar por si hace clic en el nombre de la columna na vez que encontrar el justo proceso de identificación en la lista, haga clic derecho sobre él y elija Debug. Así se iniciará Visual Studio Usted tendrá que abrir su código de archivo de Visual Studio y depuración en ese momento.

RESUMEN

Un ASP.NET HTTP Handler es una clase simple que le permite procesar una solicitud y regresar una respuesta al navegador El manejador le da acceso a la web actual contexto y el período de sesiones estado. El valor por defecto ‘Generic Hander “que Visual Studio 2005 ofrece usted no puede trabajar con su Código Actual. Con algunas modificaciones, en colaboración con los nombres System.Diagnostics tendrá que escribir HTTP manipuladores que construir y depurar con éxito.

Vinculados a un proceso para depurar un Atletismo HTTP Handler