Programmering

Sådan logges anmodnings- og svarmetadata i ASP.NET Web API

Ligesom godkendelse, caching og undtagelsesadministration er logning et tværgående problem - en funktion, der påvirker hele applikationen - som skal centraliseres. Vi logger ofte applikationsdata, der kan omfatte sekvensen af ​​metodeopkald eller begivenheder, brugerhandlinger eller endda fejl, der kan opstå, når applikationen udføres. Der er mange logningsrammer, du kan drage fordel af, men i denne artikel vil vi fokusere på, hvordan vi kan logge anmodninger og svar i ASP.NET Web API.

Logning af anmodninger og svar i Web API er nyttigt til fejlfinding, sporing og inspektion af indgående og udgående serviceopkald. Ved at logge alle anmodninger og svar ét sted bliver det let at opdage problemer i eventuelle anmodninger og svar. I dette indlæg opretter vi en brugerdefineret beskedhåndterer til at overvåge og logge anmodninger og svar i Web API. Meddelelsesbehandleren bruges til at opfange opkald og logge alle anmodninger og svar centralt ét sted.

Strategier til indsprøjtning af tværgående bekymringer i Web API

Der er flere måder at injicere logning og andre tværgående bekymringer i Web API. En måde er at oprette en brugerdefineret ApiController-klasse eller en basisklasse til alle vores controllere og derefter tilsidesætte ExecuteAsync-metoden. En anden måde er at bruge et brugerdefineret handlingsfilter. Begge disse strategier har dog deres begrænsninger. I det førstnævnte tilfælde er vi nødt til at sikre, at alle vores controllere udvider klassen til brugerdefineret basecontroller. I sidstnævnte bliver vi nødt til at sikre, at filteret påføres alle de controllere, vi bruger.

Den bedste strategi efter min mening er at bruge en beskedhåndterer, fordi du kun skriver det en gang og derefter registrerer det ét sted. Også fordi den brugerdefinerede beskedhåndterer kaldes meget tidligere i rørledningen, dvs. selv før HttpControllerDispatcher, er den velegnet til at sprøjte tværgående bekymringer. I øvrigt er beskedhåndterere klasser, der arver den abstrakte HttpMessageHandler-klasse. Derfor vil vi drage fordel af en beskedhåndterer til at indsprøjte vores brugerdefinerede logger i dette indlæg.

Hvis du vil opbygge og udføre kildekoden, der er illustreret i dette indlæg, skal du have Visual Studio i gang i dit system. Du skal også have NLog installeret. Hvis du vil vide, hvordan du installerer, konfigurerer og bruger NLog, skal du se på min artikel om NLog her.

Opbygning af vores kundelogger til Web API

Opret et nyt Web API-projekt i Visual Studio, og gem det med dit ønskede navn. Vi drager fordel af en brugerdefineret delegeringshåndterer her for at opfange opkaldene til Web API. Først og fremmest, lad os bygge en brugerdefineret POCO-klasse, der gemmer al information fra vores anmodninger og svar.

offentlig klasse LogMetadata

    {

public string RequestContentType {get; sæt; }

offentlig streng RequestUri {get; sæt; }

public string RequestMethod {get; sæt; }

offentlig DateTime? RequestTimestamp {get; sæt; }

public string ResponseContentType {get; sæt; }

offentlig HttpStatusCode ResponseStatusCode {get; sæt; }

offentlig DateTime? ResponseTimestamp {get; sæt; }

    }

Nu implementerer vi en brugerdefineret klasse kaldet LogHandler. Dette er i det væsentlige en beskedhåndterer, der udvider klassen DelegatingHandler.

offentlig klasse CustomLogHandler: DelegatingHandler

    {

beskyttet tilsidesættelse async Opgave SendAsync (HttpRequestMessage anmodning, CancellationToken cancellationToken)

        {

return base.SendAsync (anmodning, cancellationToken);

        }

    }

Følgende kodestykke viser, hvordan du kan oprette metadata om anmodninger. Denne metode kaldes fra SendAsync-metoden i vores brugerdefinerede meddelelsesbehandler og returnerer en forekomst af LogMetadata-klassen.

privat LogMetadata BuildRequestMetadata (HttpRequestMessage anmodning)

    {

LogMetadata log = ny LogMetadata

        {

RequestMethod = anmodning.Methode.Metode,

RequestTimestamp = DateTime.Now,

RequestUri = request.RequestUri.ToString ()

        };

returlog;

    }

Den næste ting, vi skal gøre, er at opdatere logmetadata-forekomsten med oplysninger fra responsobjektet. Sådan kan dette opnås.

privat LogMetadata BuildResponseMetadata (LogMetadata logMetadata, HttpResponseMessage svar)

    {

logMetadata.ResponseStatusCode = respons.StatusCode;

logMetadata.ResponseTimestamp = DateTime.Now;

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

returner logMetadata;

    }

Her er den komplette kildekode for den brugerdefinerede beskedhåndterer til din reference.

offentlig klasse CustomLogHandler: DelegatingHandler

    {

beskyttet tilsidesættelse async Opgave SendAsync (HttpRequestMessage anmodning, CancellationToken cancellationToken)

        {

var logMetadata = BuildRequestMetadata (anmodning);

var respons = afventer base.SendAsync (anmodning, cancellationToken);

logMetadata = BuildResponseMetadata (logMetadata, svar);

afvente SendToLog (logMetadata);

tilbagevenden svar

        }

private LogMetadata BuildRequestMetadata (HttpRequestMessage anmodning)

        {

LogMetadata log = ny LogMetadata

            {

RequestMethod = anmodning.Methode.Metode,

RequestTimestamp = DateTime.Now,

RequestUri = request.RequestUri.ToString ()

            };

returlog;

        }

privat LogMetadata BuildResponseMetadata (LogMetadata logMetadata, HttpResponseMessage svar)

        {

logMetadata.ResponseStatusCode = respons.StatusCode;

logMetadata.ResponseTimestamp = DateTime.Now;

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

returner logMetadata;

        }

privat async Opgave SendToLog (LogMetadata logMetadata)

        {

// TODO: Skriv kode her for at gemme logMetadata-forekomsten til et forudkonfigureret loglager ...

returner sandt;

        }

    }

Bemærk, at du skal skrive den nødvendige kode for at gemme logMetadata-forekomsten vist i SendToLog-metoden til et forudkonfigureret logmål, dvs. en fil eller en database. Jeg foretrækker at bruge NLog til at logge disse metadata. Igen kan du henvise til min artikel om NLog for at se, hvordan dette kan gøres.

Registrering af meddelelsesbehandleren

For at registrere den brugerdefinerede meddelelseshåndterer kan du drage fordel af Application_Start-begivenheden i filen Global.asax.cs eller Registreringsmetoden i WebApiConfig-klassen. Følgende kodestykke illustrerer, hvordan du kan registrere handleren ved hjælp af Registreringsmetoden i WebApiConfig-klassen.

offentligt statisk ugyldigt register (HttpConfiguration config)

    {

// Skriv din sædvanlige kode her ...

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

    }

I denne artikel undersøgte vi, hvordan vi kan logge anmodninger og svar i Web API ved hjælp af en brugerdefineret beskedhåndterer. Beskedhåndterere er en glimrende måde at sprede tværgående bekymringer i Web API-pipelinen. Selvom vi har andre måder at injicere logning på Web API, såsom en brugerdefineret ApiController-klasse eller et brugerdefineret handlingsfilter, er det en enklere fremgangsmåde at bruge en brugerdefineret meddelelseshåndterer. Du er velkommen til at tilpasse denne implementering baseret på dine krav, f.eks. For at tilføje flere tilpassede metadata.

Sådan gør du mere i ASP.NET og ASP.NET Core:

  • Sådan bruges cache i hukommelsen i ASP.NET Core
  • Sådan håndteres fejl i ASP.NET Web API
  • Sådan overføres flere parametre til Web API-controller-metoder
  • Sådan logges anmodnings- og svarmetadata i ASP.NET Web API
  • Sådan arbejder du med HttpModules i ASP.NET
  • Avanceret versionering i ASP.NET Core Web API
  • Sådan bruges afhængighedsinjektion i ASP.NET Core
  • Sådan arbejder du med sessioner i ASP.NET
  • Sådan arbejder du med HTTPHandlers i ASP.NET
  • Sådan bruges IHostedService i ASP.NET Core
  • Sådan forbruges en WCF SOAP-tjeneste i ASP.NET Core
  • Sådan forbedres ydeevnen for ASP.NET Core-applikationer
  • Sådan forbruges en ASP.NET Core Web API ved hjælp af RestSharp
  • Sådan arbejder du med logning i ASP.NET Core
  • Sådan bruges MediatR i ASP.NET Core
  • Sådan arbejder du med sessionstilstand i ASP.NET Core
  • Sådan bruges Nancy i ASP.NET Core
  • Forstå parameterbinding i ASP.NET Web API
  • Sådan uploades filer i ASP.NET Core MVC
  • Sådan implementeres global undtagelseshåndtering i ASP.NET Core Web API
  • Sådan implementeres sundhedstjek i ASP.NET Core
  • Bedste fremgangsmåder inden caching i ASP.NET
  • Sådan bruges Apache Kafka-meddelelser i .NET
  • Sådan aktiveres CORS på din web-API
  • Hvornår skal man bruge WebClient vs. HttpClient vs. HttpWebRequest
  • Sådan arbejder du med Redis Cache i .NET
  • Hvornår skal man bruge Task.WaitAll vs. Task.WhenAll i .NET