Registro de tiempo – Convertir HTML – Ejemplo de C#

En este artículo, encontrará un ejemplo del uso de controladores de mensajes personalizados para convertir HTML de un archivo ZIP a PDF y registrar el tiempo de ejecución de este proceso.

A veces, para optimizar el rendimiento, es posible que necesite conocer el tiempo de ejecución de la solicitud web. Por ejemplo, desea saber cuánto tiempo se tarda en convertir un archivo basado en HTML de un archivo ZIP a PDF.

Registro de tiempo de ejecución

Crear un controlador de mensajes para una implementación de esquema personalizado

Creemos un controlador personalizado que pueda usar para la implementación de un esquema (protocolo) personalizado. Tome los siguientes pasos:

  1. Utilice el espacio de nombres necesario, que es Aspose.Html.Net.
  2. Defina su propia clase CustomSchemaMessageHandler que se derivará de la clase MessageHandler.
  3. Inicialice una instancia de la clase CustomSchemaMessageHandler y defina una propiedad Filter para ella.
  4. Cree la clase CustomSchemaMessageFilter que se deriva de la clase MessageFilter.
  5. Anule el método Match() de la clase MessageFilter para implementar el comportamiento personalizado del controlador de mensajes.

El siguiente fragmento de código muestra cómo crear la clase CustomSchemaMessageHandler:

 1// Define the CustomSchemaMessageFilter class that is derived from the MessageFilter class
 2class CustomSchemaMessageFilter : MessageFilter
 3{
 4    private readonly string schema;
 5    public CustomSchemaMessageFilter(string schema)
 6    {
 7        this.schema = schema;
 8    }
 9    // Override the Match() method
10    public override bool Match(INetworkOperationContext context)
11    {
12        return string.Equals(schema, context.Request.RequestUri.Protocol.TrimEnd(':'));
13    }
14}
15
16// Define the CustomSchemaMessageHandler class that is derived from the MessageHandler class
17abstract class CustomSchemaMessageHandler : MessageHandler
18{
19    // Initialize an instance of the CustomSchemaMessageHandler class
20    protected CustomSchemaMessageHandler(string schema)
21    {
22        Filters.Add(new CustomSchemaMessageFilter(schema));
23    }
24}

El constructor CustomSchemaMessageHandler(schema) crea una instancia del objeto CustomSchemaMessageHandler y toma el schema como parámetro. El método Add() agrega el objeto CustomSchemaMessageFilter al final de la colección. El método Match() prueba si un context satisface los criterios del filtro.

Creación de ZipFileSchemaMessageHandler para trabajar con archivos ZIP

El siguiente fragmento de código muestra cómo crear la clase ZipFileSchemaMessageHandler para trabajar con archivos ZIP:

 1// Define the ZipFileSchemaMessageHandler class that is derived from the CustomSchemaMessageHandler class
 2class ZipFileSchemaMessageHandler : CustomSchemaMessageHandler
 3{
 4    private readonly Archive archive;
 5
 6    public ZipFileSchemaMessageHandler(Archive archive) : base("zip-file")
 7    {
 8        this.archive = archive;
 9    }
10
11    // Override the Invoke() method
12    public override void Invoke(INetworkOperationContext context)
13    {
14        var pathInsideArchive = context.Request.RequestUri.Pathname.TrimStart('/').Replace("\\", "/");
15        var stream = GetFile(pathInsideArchive);
16
17        if (stream != null)
18        {
19            // If a resource is found in the archive, then return it as a Response
20            var response = new ResponseMessage(HttpStatusCode.OK);
21            response.Content = new StreamContent(stream);
22            response.Headers.ContentType.MediaType = MimeType.FromFileExtension(context.Request.RequestUri.Pathname);
23            context.Response = response;
24        }
25        else
26        {
27            context.Response = new ResponseMessage(HttpStatusCode.NotFound);
28        }
29
30        // Invoke the next message handler in the chain
31        Next(context);
32    }
33
34    Stream GetFile(string path)
35    {
36        var result = archive
37            .Entries
38            .FirstOrDefault(x => x.Name == path);
39        return result?.Open();
40    }
41}

En el ejemplo anterior, se realiza la búsqueda de un recurso (archivo zip) en su URI. Si se encuentra un recurso, el método FromFileExtension() devuelve el MimeType del recurso.

Controlador de mensajes para un registro del tiempo de ejecución de una solicitud web

El siguiente fragmento de código muestra cómo crear StartRequestDurationLoggingMessageHandler y StopRequestDurationLoggingMessageHandler para registrar el tiempo necesario para la ejecución de la solicitud web.

 1// Define the RequestDurationLoggingMessageHandler class that is derived from the MessageHandler class
 2abstract class RequestDurationLoggingMessageHandler : MessageHandler
 3{
 4    private static ConcurrentDictionary<Url, Stopwatch> requests = new ConcurrentDictionary<Url, Stopwatch>();
 5
 6    protected void StartTimer(Url url)
 7    {
 8        requests.TryAdd(url, Stopwatch.StartNew());
 9    }
10
11    protected TimeSpan StopTimer(Url url)
12    {
13        var timer = requests[url];
14        timer.Stop();
15        return timer.Elapsed;
16    }
17}
18
19class StartRequestDurationLoggingMessageHandler : RequestDurationLoggingMessageHandler
20{
21    // Override the Invoke() method
22    public override void Invoke(INetworkOperationContext context)
23    {
24        // Start the stopwatch
25        StartTimer(context.Request.RequestUri);
26
27        // Invoke the next message handler in the chain
28        Next(context);
29    }
30}
31
32class StopRequestDurationLoggingMessageHandler : RequestDurationLoggingMessageHandler
33{
34    // Override the Invoke() method
35    public override void Invoke(INetworkOperationContext context)
36    {
37        // Stop the stopwatch
38        var duration = StopTimer(context.Request.RequestUri);
39
40        // Print the result
41        Debug.WriteLine($"Elapsed: {duration:g}, resource: {context.Request.RequestUri.Pathname}");
42
43        // Invoke the next message handler in the chain
44        Next(context);
45    }
46}

Agregar los controladores de mensajes a la canalización

El concepto clave del trabajo de los manejadores de mensajes es encadenarlos. Hemos creado varios controladores de mensajes y debemos agregarlos a la canalización en un orden específico para implementar el ejemplo de registro de tiempo de conversión de HTML de archivo ZIP a PDF. Realicemos los siguientes pasos:

  1. Cree una instancia de la clase Configuración.
  2. Implemente el esquema personalizado ZIP. Utilice el método Add() para agregar ZipFileSchemaMessageHandler al final de la canalización.
  3. Ejecute el registro de duración. Utilice el método Insert() para agregar StartRequestDurationLoggingMessageHandler primero en la canalización y el método Add() para agregar StopRequestDurationLoggingMessageHandler al final de la canalización.
  4. Inicialice un documento HTML con la configuración especificada.
  5. Cree el dispositivo PDF y renderice HTML a PDF.
 1// Add this line before you try to use the 'IBM437' encoding
 2System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
 3
 4// Prepare path to a source zip file
 5string documentPath = Path.Combine(DataDir, "test.zip");
 6
 7// Prepare path for converted file saving
 8string savePath = Path.Combine(OutputDir, "zip-to-pdf-duration.pdf");
 9
10// Create an instance of the Configuration class
11using var configuration = new Configuration();
12var service = configuration.GetService<INetworkService>();
13var handlers = service.MessageHandlers;
14
15// Custom Schema: ZIP. Add ZipFileSchemaMessageHandler to the end of the pipeline
16handlers.Add(new ZipFileSchemaMessageHandler(new Archive(documentPath)));
17
18// Duration Logging. Add the StartRequestDurationLoggingMessageHandler at the first place in the pipeline
19handlers.Insert(0, new StartRequestDurationLoggingMessageHandler());
20
21// Add the StopRequestDurationLoggingMessageHandler to the end of the pipeline
22handlers.Add(new StopRequestDurationLoggingMessageHandler());
23
24// Initialize an HTML document with specified configuration
25using var document = new HTMLDocument("zip-file:///test.html", configuration);
26
27// Create the PDF Device
28using var device = new PdfDevice(savePath);
29
30// Render ZIP to PDF
31document.RenderTo(device);

El constructor Configuration() crea una instancia de la clase Configuration. Una vez creada la configuración, se invocan los métodos GetService<INetworkService>(), MessageHandlers.Add() y MessageHandlers.Insert(). Los métodos Insert() y Add() agregan los controladores de mensajes personalizados en la colección de controladores de mensajes existentes. La figura muestra la cadena de controladores de mensajes para este ejemplo:

Texto “La cadena de manejadores de mensajes”

Nota: El constructor HTMLDocument(address, configuration) toma la ruta absoluta al archivo ZIP. Pero todos los recursos relacionados tienen rutas relativas en el documento HTML y en el código del ejemplo.

Puede descargar los ejemplos completos y los archivos de datos desde GitHub.

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.