Kako prijaviti metapodatke zahtjeva i odgovora u ASP.NET Web API

Poput provjere autentičnosti, predmemoriranja i upravljanja iznimkama, zapisivanje je presretna briga - funkcija koja utječe na cijelu aplikaciju - koja bi trebala biti centralizirana. Često bilježimo podatke aplikacije koji mogu uključivati ​​slijed poziva ili događaja metode, radnje korisnika ili čak pogreške koje se mogu pojaviti kada se aplikacija izvršava. Postoji mnogo okvira za evidentiranje koje biste mogli iskoristiti, ali u ovom ćemo se članku usredotočiti na to kako možemo evidentirati zahtjeve i odgovore u ASP.NET Web API.

Zapisivanje zahtjeva i odgovora u web API-ju korisno je pri otklanjanju pogrešaka, praćenju i inspekciji dolaznih i odlaznih poziva usluga. Bilježenjem svih zahtjeva i odgovora na jednom mjestu, otkrivanje problema u bilo kojim zahtjevima i odgovorima postaje jednostavno. U ovom ćemo postu stvoriti prilagođeni rukovatelj porukama za praćenje i evidentiranje zahtjeva i odgovora u web API-ju. Obrađivač poruka služit će za presretanje poziva i centralno bilježenje svih zahtjeva i odgovora na jednom mjestu.

Strategije ubrizgavanja unakrsnih problema u web API

Postoji više načina za ubrizgavanje evidentiranja i drugih zapreka u web API. Jedan od načina je stvaranje prilagođene klase ApiController ili osnovne klase za sve naše kontrolere, a zatim nadjačavanje metode ExecuteAsync. Drugi način je upotreba prilagođenog filtra radnje. Međutim, obje ove strategije imaju svoja ograničenja. U prvom bismo slučaju morali osigurati da svi naši kontroleri prošire prilagođenu osnovnu klasu kontrolera. U potonjem bismo morali osigurati da se filtar primijeni na sve kontrolere koje koristimo.

Po meni je najbolja strategija koristiti rukovatelj porukama jer ga napišete samo jednom, a zatim registrirate na jednom mjestu. Također, budući da će se prilagođeni rukovatelj porukama pozvati mnogo ranije u cjevovodu, tj. Čak i prije HttpControllerDispatcher, vrlo je pogodan za ubrizgavanje zakrčenih problema. Inače, rukovatelji porukama su klase koje nasljeđuju apstraktnu klasu HttpMessageHandler. Stoga ćemo iskoristiti alat za obradu poruka kako bismo ubacili svoj prilagođeni zapisnik u ovaj post.

Ako želite izgraditi i izvršiti izvorni kod prikazan u ovom postu, u sustavu biste trebali pokrenuti i pokrenuti Visual Studio. Također, trebali biste instalirati NLog. Ako želite znati kako instalirati, konfigurirati i koristiti NLog, ovdje pogledajte moj članak o NLogu.  

Izgradnja naše evidencije kupaca za web API

Stvorite novi projekt web API-ja u Visual Studiju i spremite ga sa željenim imenom. Ovdje ćemo iskoristiti prilagođeni rukovatelj za delegiranje za presretanje poziva na web API. Prvo, izradimo prilagođenu POCO klasu koja će pohraniti sve podatke iz naših zahtjeva i odgovora.

javna klasa LogMetadata

    {

        javni niz RequestContentType {get; postavljen; }

        javni niz RequestUri {get; postavljen; }

        javni niz RequestMethod {get; postavljen; }

        javni DateTime? RequestTimestamp {get; postavljen; }

        javni niz ResponseContentType {get; postavljen; }

        javni HttpStatusCode ResponseStatusCode {get; postavljen; }

        javni DateTime? ResponseTimestamp {get; postavljen; }

    }

Sada ćemo implementirati prilagođenu klasu nazvanu LogHandler. Ovo je u osnovi rukovatelj porukama koji proširuje klasu DelegatingHandler.

javna klasa CustomLogHandler: DelegatingHandler

    {

        zaštićeno nadjačavanje asinkronog zadatka SendAsync (HttpRequestMessage zahtjev, CancellationToken cancellationToken)

        {

           return base.SendAsync (zahtjev, otkazivanjeToken);

        }

    }

Sljedeći isječak koda pokazuje kako možete izgraditi metapodatke zahtjeva. Ova metoda pozvat će se iz metode SendAsync našeg prilagođenog rukovatelja porukama i vratit će instancu klase LogMetadata.

privatni LogMetadata BuildRequestMetadata (zahtjev za HttpRequestMessage)

    {

        LogMetadata log = novi LogMetadata

        {

            RequestMethod = request.Method.Method,

            RequestTimestamp = DateTime.Sada,

            RequestUri = request.RequestUri.ToString ()

        };

        dnevnik povratka;

    }

Sljedeće što moramo učiniti je ažurirati instancu metapodataka dnevnika informacijama iz objekta odgovora. Evo kako se to može postići.

privatni LogMetadata BuildResponseMetadata (LogMetadata logMetadata, HttpResponseMessage odgovor)

    {

        logMetadata.ResponseStatusCode = response.StatusCode;

        logMetadata.ResponseTimestamp = Vrijeme, Sad;

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

        return logMetadata;

    }

Ovdje je potpuni izvorni kod prilagođenog rukovatelja porukama za vašu referencu.

javna klasa CustomLogHandler: DelegatingHandler

    {

        zaštićeno nadjačavanje asinkronog zadatka SendAsync (HttpRequestMessage zahtjev, CancellationToken cancellationToken)

        {

            var logMetadata = BuildRequestMetadata (zahtjev);

            var odgovor = pričekati base.SendAsync (zahtjev, otkazivanjeToken);

            logMetadata = BuildResponseMetadata (logMetadata, odgovor);

            čekati SendToLog (logMetadata);

            odgovor na povratak;

        }

        privatni LogMetadata BuildRequestMetadata (zahtjev za HttpRequestMessage)

        {

            LogMetadata log = novi LogMetadata

            {

                RequestMethod = request.Method.Method,

                RequestTimestamp = DateTime.Sada,

                RequestUri = request.RequestUri.ToString ()

            };

            dnevnik povratka;

        }

        privatni LogMetadata BuildResponseMetadata (LogMetadata logMetadata, HttpResponseMessage odgovor)

        {

            logMetadata.ResponseStatusCode = response.StatusCode;

            logMetadata.ResponseTimestamp = Vrijeme, Sad;

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

            return logMetadata;

        }

        privatni asinkroni zadatak SendToLog (LogMetadata logMetadata)

        {

            // TODO: Ovdje napišite kod za pohranu instance logMetadata u unaprijed konfiguriranu trgovinu dnevnika ...

            povratak istinit;

        }

    }

Imajte na umu da morate napisati potreban kôd za spremanje instance logMetadata prikazane u metodi SendToLog u unaprijed konfigurirani cilj dnevnika, tj. U datoteku ili bazu podataka. Više volim koristiti NLog za bilježenje ovih metapodataka. Opet, možete pogledati moj članak o NLogu kako biste vidjeli kako se to može učiniti.

Registriranje obrađivača poruka

Da biste registrirali prilagođeni rukovatelj porukama, možete iskoristiti događaj Application_Start u datoteci Global.asax.cs ili metodu registracije klase WebApiConfig. Sljedeći isječak koda ilustrira kako možete registrirati obrađivač pomoću metode Registriraj klase WebApiConfig.

javni statički void Registar (HttpConfiguration config)

    {

      // Ovdje napišite svoj uobičajeni kod ...

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

    }

U ovom smo članku ispitali kako možemo evidentirati zahtjeve i odgovore u web API-ju pomoću prilagođenog rukovatelja porukama. Obrađivači poruka izvrstan su način ubrizgavanja unakrsnih problema u cjevovod Web API-ja. Iako imamo druge načine za ubrizgavanje prijave u Web API, poput prilagođene klase ApiController ili prilagođenog filtra radnje, korištenje prilagođenog rukovatelja porukama jednostavniji je pristup. Možete slobodno prilagoditi ovu implementaciju na temelju svojih zahtjeva, npr. Dodati više prilagođenih metapodataka.

Kako učiniti više u ASP.NET i ASP.NET Core:

  • Kako se koristi predmemoriranje u memoriji u ASP.NET Core
  • Kako postupati s pogreškama u ASP.NET web API-ju
  • Kako proslijediti više parametara metodama kontrolera Web API-ja
  • Kako prijaviti metapodatke zahtjeva i odgovora u ASP.NET Web API
  • Kako raditi s HttpModules-om u ASP.NET-u
  • Napredna verzija u ASP.NET Core Web API
  • Kako se koristi ubrizgavanje ovisnosti u ASP.NET Core
  • Kako raditi sa sesijama u ASP.NET-u
  • Kako raditi s HTTPHandlerima u ASP.NET-u
  • Kako koristiti IHostedService u ASP.NET Core
  • Kako potrošiti WCF SOAP uslugu u ASP.NET Core
  • Kako poboljšati izvedbu ASP.NET Core aplikacija
  • Kako konzumirati ASP.NET Core Web API pomoću RestSharp
  • Kako raditi s prijavom u ASP.NET Core
  • Kako koristiti MediatR u ASP.NET Core
  • Kako raditi sa stanjem sesije u ASP.NET Coreu
  • Kako koristiti Nancy u ASP.NET Coreu
  • Razumijevanje vezivanja parametara u ASP.NET Web API-ju
  • Kako prenijeti datoteke u ASP.NET Core MVC
  • Kako implementirati rukovanje globalnim iznimkama u ASP.NET Core Web API
  • Kako implementirati provjere zdravlja u ASP.NET Core
  • Najbolji primjeri u predmemoriranju u ASP.NET-u
  • Kako koristiti Apache Kafka razmjenu poruka u .NET-u
  • Kako omogućiti CORS na vašem web API-ju
  • Kada koristiti WebClient u odnosu na HttpClient u odnosu na HttpWebRequest
  • Kako raditi s predmemorijom Redis u .NET-u
  • Kada koristiti Task.WaitAll vs. Task.WhenAll u .NET