Programmering

Hvordan logge forespørsels- og svarmetadata i ASP.NET Web API

I likhet med autentisering, hurtigbufring og unntakshåndtering, er logging en tverrgående bekymring - en funksjon som påvirker hele applikasjonen - som skal sentraliseres. Vi logger ofte applikasjonsdata som kan inkludere sekvensen av metodeanrop eller hendelser, brukerhandlinger eller til og med feil som kan oppstå når applikasjonen kjøres. Det er mange loggingsrammer du kan dra nytte av, men i denne artikkelen vil vi fokusere på hvordan vi kan logge forespørsler og svar i ASP.NET Web API.

Registreringsforespørsler og svar i Web API er nyttig i feilsøking, sporing og inspeksjon av innkommende og utgående tjenesteanrop. Ved å logge alle forespørsler og svar på ett sted, blir det enkelt å oppdage problemer i forespørsler og svar. I dette innlegget vil vi lage en tilpasset meldingsbehandler for å overvåke og logge forespørsler og svar i Web API. Meldingsbehandleren vil bli brukt til å fange opp samtaler og logge alle forespørsler og svar sentralt på ett sted.

Strategier for å sprøyte tverrgående bekymringer i Web API

Det er flere måter å injisere logging og andre tverrgående bekymringer i Web API. En måte er å opprette en tilpasset ApiController-klasse eller en basisklasse for alle våre kontrollere, og deretter overstyre ExecuteAsync-metoden. En annen måte er å bruke et tilpasset handlingsfilter. Begge disse strategiene har imidlertid sine begrensninger. I det tidligere tilfellet må vi sørge for at alle våre kontrollere utvider den tilpassede basekontrollerklassen. I sistnevnte må vi sørge for at filteret påføres alle kontrollerne vi bruker.

Den beste strategien etter min mening er å bruke en meldingsbehandler fordi du bare skriver den en gang og deretter registrerer den på ett sted. Også fordi den tilpassede meldingsbehandleren blir kalt mye tidligere i rørledningen, dvs. selv før HttpControllerDispatcher, er den velegnet til å injisere tverrgående bekymringer. For øvrig er meldingshåndterere klasser som arver den abstrakte HttpMessageHandler-klassen. Derfor vil vi dra nytte av en meldingsbehandler for å injisere vår tilpassede logger i dette innlegget.

Hvis du vil bygge og utføre kildekoden som er illustrert i dette innlegget, bør du ha Visual Studio i gang i systemet ditt. Du bør også ha NLog installert. Hvis du vil vite hvordan du installerer, konfigurerer og bruker NLog, kan du ta en titt på artikkelen min om NLog her.

Bygg vår kundelogger for Web API

Opprett et nytt Web API-prosjekt i Visual Studio og lagre det med ønsket navn. Vi vil benytte oss av en tilpasset delegeringsbehandler her for å fange opp samtalene til Web API. For det første, la oss lage en tilpasset POCO-klasse som lagrer all informasjonen fra våre forespørsler og svar.

offentlig klasse LogMetadata

    {

offentlig streng RequestContentType {get; sett; }

offentlig streng RequestUri {get; sett; }

public string RequestMethod {get; sett; }

offentlig DateTime? RequestTimestamp {get; sett; }

offentlig streng ResponseContentType {get; sett; }

offentlig HttpStatusCode ResponseStatusCode {get; sett; }

offentlig DateTime? ResponseTimestamp {get; sett; }

    }

Nå implementerer vi en tilpasset klasse kalt LogHandler. Dette er egentlig en meldingsbehandler som utvider DelegatingHandler-klassen.

offentlig klasse CustomLogHandler: DelegatingHandler

    {

beskyttet overstyring async Oppgave SendAsync (HttpRequestMessage forespørsel, CancellationToken cancellationToken)

        {

retur base.SendAsync (forespørsel, cancellationToken);

        }

    }

Følgende kodebit viser hvordan du kan lage metadata for forespørsel. Denne metoden vil bli kalt fra SendAsync-metoden til vår tilpassede meldingsbehandler og vil returnere en forekomst av LogMetadata-klassen.

private LogMetadata BuildRequestMetadata (HttpRequestMessage forespørsel)

    {

LogMetadata log = new LogMetadata

        {

RequestMethod = request.Method.Method,

RequestTimestamp = DateTime.Now,

RequestUri = request.RequestUri.ToString ()

        };

returlogg;

    }

Den neste tingen vi trenger å gjøre er å oppdatere loggmetadatainstansen med informasjon fra responsobjektet. Slik kan dette oppnås.

private LogMetadata BuildResponseMetadata (LogMetadata logMetadata, HttpResponseMessage response)

    {

logMetadata.ResponseStatusCode = respons.StatusCode;

logMetadata.ResponseTimestamp = DateTime.Now;

logMetadata.ResponseContentType = respons.Content.Headers.ContentType.MediaType;

retur logMetadata;

    }

Her er den komplette kildekoden til den tilpassede meldingsbehandleren som referanse.

offentlig klasse CustomLogHandler: DelegatingHandler

    {

beskyttet overstyring async Oppgave SendAsync (HttpRequestMessage forespørsel, CancellationToken cancellationToken)

        {

var logMetadata = BuildRequestMetadata (forespørsel);

var respons = avventer base.SendAsync (forespørsel, cancellationToken);

logMetadata = BuildResponseMetadata (logMetadata, respons);

venter på SendToLog (logMetadata);

returrespons;

        }

private LogMetadata BuildRequestMetadata (HttpRequestMessage forespørsel)

        {

LogMetadata log = ny LogMetadata

            {

RequestMethod = request.Method.Method,

RequestTimestamp = DateTime.Now,

RequestUri = request.RequestUri.ToString ()

            };

returlogg;

        }

private LogMetadata BuildResponseMetadata (LogMetadata logMetadata, HttpResponseMessage response)

        {

logMetadata.ResponseStatusCode = respons.StatusCode;

logMetadata.ResponseTimestamp = DateTime.Now;

logMetadata.ResponseContentType = respons.Content.Headers.ContentType.MediaType;

retur logMetadata;

        }

private async Oppgave SendToLog (LogMetadata logMetadata)

        {

// TODO: Skriv kode her for å lagre logMetadata-forekomsten til en forhåndskonfigurert loggbutikk ...

returner sant;

        }

    }

Merk at du må skrive den nødvendige koden for å lagre logMetadata-forekomsten som vises i SendToLog-metoden til et forhåndskonfigurert loggmål, dvs. en fil eller en database. Jeg foretrekker å bruke NLog til å logge denne metadata. Igjen kan du referere til artikkelen min om NLog for å se hvordan dette kan gjøres.

Registrering av meldingsbehandleren

For å registrere den egendefinerte meldingsbehandleren kan du dra nytte av Application_Start-hendelsen i Global.asax.cs-filen eller Register-metoden i WebApiConfig-klassen. Følgende kodebit illustrerer hvordan du kan registrere behandleren ved hjelp av Register-metoden til WebApiConfig-klassen.

public static void Register (HttpConfiguration config)

    {

// Skriv din vanlige kode her ...

config.MessageHandlers.Add (ny CustomLogHandler ());

    }

I denne artikkelen undersøkte vi hvordan vi kan logge forespørsler og svar i Web API ved hjelp av en tilpasset meldingsbehandler. Meldingshåndterere er en utmerket måte å injisere kryssende bekymringer i Web API-rørledningen. Selv om vi har andre måter å injisere logging på Web API, for eksempel en tilpasset ApiController-klasse eller et tilpasset handlingsfilter, er det en enklere måte å bruke en tilpasset meldingsbehandler. Du kan gjerne tilpasse denne implementeringen basert på dine krav, for eksempel for å legge til flere tilpassede metadata.

Hvordan gjøre mer i ASP.NET og ASP.NET Core:

  • Hvordan bruke hurtigbufring i minnet i ASP.NET Core
  • Hvordan håndtere feil i ASP.NET Web API
  • Hvordan overføre flere parametere til Web API-kontrollermetoder
  • Hvordan logge forespørsels- og svarmetadata i ASP.NET Web API
  • Hvordan jobbe med HttpModules i ASP.NET
  • Avansert versjonering i ASP.NET Core Web API
  • Hvordan bruke avhengighetsinjeksjon i ASP.NET Core
  • Hvordan jobbe med økter i ASP.NET
  • Hvordan jobbe med HTTPHandlers i ASP.NET
  • Hvordan bruke IHostedService i ASP.NET Core
  • Hvordan forbruke en WCF SOAP-tjeneste i ASP.NET Core
  • Hvordan forbedre ytelsen til ASP.NET Core-applikasjoner
  • Slik bruker du et ASP.NET Core Web API ved hjelp av RestSharp
  • Hvordan jobbe med innlogging i ASP.NET Core
  • Hvordan bruke MediatR i ASP.NET Core
  • Hvordan jobbe med økttilstand i ASP.NET Core
  • Hvordan bruke Nancy i ASP.NET Core
  • Forstå parameterinnbinding i ASP.NET Web API
  • Hvordan laste opp filer i ASP.NET Core MVC
  • Hvordan implementere global unntaksbehandling i ASP.NET Core Web API
  • Hvordan implementere helsesjekker i ASP.NET Core
  • Beste fremgangsmåter for hurtigbufring i ASP.NET
  • Hvordan bruke Apache Kafka-meldinger i .NET
  • Hvordan aktivere CORS på web-API-et
  • Når skal du bruke WebClient vs. HttpClient vs. HttpWebRequest
  • Hvordan jobbe med Redis Cache i .NET
  • Når skal jeg bruke Task.WaitAll vs. Task.WhenAll i .NET
$config[zx-auto] not found$config[zx-overlay] not found