ASP.NET Core:registrazione di richieste e risposte

ASP.NET Core:registrazione di richieste e risposte

Il modo più semplice per registrare richieste/risposte consiste nell'utilizzare il middleware HTTP Logging (aggiunto nella v6). Questo è configurabile, quindi puoi adattarlo alle tue esigenze. Se hai bisogno di un maggiore controllo, puoi invece aggiungere il tuo middleware.

Per utilizzare il middleware di registrazione HTTP, chiama UseHttpLogging() nel codice di inizializzazione:

var app = builder.Build();

app.UseHttpLogging();

//rest of code
Code language: C# (cs)

Quindi aggiungi Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware ad appsettings.json:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning",
      "Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware": "Information"
    }
  },
  "AllowedHosts": "*"
}

Code language: JSON / JSON with Comments (json)

Ora invia una richiesta per vederlo funzionare. Ecco un esempio di ciò che registra quando invio una richiesta GET con Postman:

info: Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware[1]
      Request:
      Protocol: HTTP/1.1
      Method: GET
      Scheme: https
      PathBase:
      Path: /weatherforecast
      Accept: */*
      Connection: keep-alive
      Host: localhost:7291
      User-Agent: PostmanRuntime/7.29.2
      Accept-Encoding: gzip, deflate, br
      Cache-Control: no-cache
      IsTest: [Redacted]
      SecretToken: [Redacted]
      Postman-Token: [Redacted]
info: Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware[2]
      Response:
      StatusCode: 200
      Content-Type: application/json; charset=utf-8
      Date: Wed, 31 Aug 2022 14:04:17 GMT
      Server: Kestrel
      Transfer-Encoding: chunkedCode language: plaintext (plaintext)

Nota:se stai utilizzando Swagger, vedrai un sacco di informazioni registrate al primo avvio.

Nel resto di questo articolo spiegherò come configurare HTTP Logger.

Configurazione di ciò che viene registrato

Il middleware HTTP Logging registra le seguenti informazioni per impostazione predefinita:

  • Proprietà della richiesta (percorso, protocollo, metodo e schema) e intestazioni.
  • Proprietà della risposta (codice di stato) e intestazioni.

È possibile configurare ciò che viene registrato chiamando AddHttpLogging() nel codice di inizializzazione e impostando le proprietà HttpLoggingOptions su ciò che si desidera.

Ad esempio, supponiamo che tu voglia solo registrare il percorso/metodo della richiesta e il codice di stato della risposta. Ecco come farlo:

using Microsoft.AspNetCore.HttpLogging;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddHttpLogging(httpLoggingOptions =>
{
	httpLoggingOptions.LoggingFields =
		HttpLoggingFields.RequestPath | 
		HttpLoggingFields.RequestMethod | 
		HttpLoggingFields.ResponseStatusCode;
});

//rest of code
Code language: C# (cs)

Nota:LoggingFields utilizza l'attributo [Flags], quindi puoi assegnargli più opzioni di enumerazione OPPURE combinandole insieme a bit.

Ecco come appare quando invii una richiesta (GET /weatherforecast) con una risposta 200:

info: Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware[1]
      Request:
      Method: GET
      PathBase:
      Path: /weatherforecast
info: Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware[2]
      Response:
      StatusCode: 200Code language: plaintext (plaintext)

Suggerisco di dare un'occhiata a tutte le impostazioni di configurazione e scegliere quello che ha senso per accedere alla tua situazione.

Intestazioni di richiesta/risposta

Quando registri le intestazioni di richiesta/risposta, devi specificare quali intestazioni desideri siano completamente registrate. Se non specifichi un'intestazione, verrà registrata con il suo nome e [Redacted] (invece del valore effettivo). In altre parole, puoi vedere che è presente un'intestazione, ma devi attivarla per poterne vedere il valore effettivo.

Puoi specificare le intestazioni aggiungendole a HttpLoggingOptions.RequestHeaders/ResponseHeaders in AddHttpLogging(). Ecco un esempio di configurazione per registrare completamente un'intestazione di richiesta chiamata IsTest:

builder.Services.AddHttpLogging(opts =>
{
	opts.RequestHeaders.Add("IsTest");
});
Code language: C# (cs)

Ora, quando arriva una richiesta con questa intestazione, mostrerà il valore effettivo di questa intestazione. Ecco un esempio di ciò che registra:

info: Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware[1]
      Request:
      Protocol: HTTP/1.1
      Method: GET
      Scheme: https
      PathBase:
      Path: /weatherforecast
      IsTest: true
      ...other headers...
Code language: plaintext (plaintext)

Se non avessi aggiunto "IsTest" a RequestHeaders, lo registrerebbe in questo modo:

IsTest: [Redacted]Code language: plaintext (plaintext)

Hanno fatto un buon lavoro progettando questa funzione. Ti impedisce di mostrare accidentalmente informazioni sensibili nei registri. Devi scegliere quali valori di intestazione mostrare effettivamente.

Intestazioni registrate per impostazione predefinita

Esistono diverse intestazioni di richiesta/risposta che sono completamente registrate per impostazione predefinita. Sono già stati aggiunti a RequestHeaders/ResponseHeaders, quindi non è necessario aggiungerli esplicitamente da soli.

Queste intestazioni predefinite sono elencate di seguito.

Intestazioni delle richieste:

  • Accetta
  • Accetta set di caratteri
  • Accetta codifica
  • Accetta lingua
  • Consenti
  • Controllo della cache
  • Connessione
  • Codifica dei contenuti
  • Lunghezza del contenuto
  • Tipo di contenuto
  • Data
  • DNT
  • Aspetti
  • Ospite
  • Attaccanti massimi
  • Gamma
  • Sec-WebSocket-Estensioni
  • Versione Sec-WebSocket
  • TE
  • Trailer
  • Codifica di trasferimento
  • Aggiorna
  • Agente utente
  • Avviso
  • X-Richiesto-Con
  • Compatibile con X-UA

Intestazioni di risposta:

  • Accetta-Intervalli
  • Età
  • Consenti
  • Alt-Svc
  • Connessione
  • Disposizione dei contenuti
  • Lingua dei contenuti
  • Lunghezza del contenuto
  • Posizione dei contenuti
  • Gamma di contenuti
  • Tipo di contenuto
  • Data
  • Scade
  • Ultima modifica
  • Posizione
  • Server
  • :stato
  • Codifica di trasferimento
  • Aggiorna
  • X-Powered-By

Se non vuoi che una di queste intestazioni predefinite sia completamente registrata, puoi rimuoverla dalla configurazione. Ecco un esempio di rimozione dell'intestazione della richiesta User-Agent:

builder.Services.AddHttpLogging(httpLoggingOptions =>
{
	httpLoggingOptions.RequestHeaders.Remove("User-Agent");
}); 
Code language: C# (cs)

Nota:puoi rimuovere tutte le impostazioni predefinite cancellando la raccolta:httpLoggingOptions.RequestHeaders.Clear().

Come qualsiasi altra intestazione che non fa parte della raccolta RequestHeaders, questa intestazione verrà registrata senza il suo valore effettivo:

User-Agent: [Redacted]Code language: plaintext (plaintext)