Programmēšana

Kā reģistrēt pieprasījuma un atbildes metadatus ASP.NET Web API

Tāpat kā autentifikācija, kešatmiņa un izņēmumu pārvaldība, arī reģistrēšana ir transversāla problēma - funkcija, kas ietekmē visu lietojumprogrammu -, kas būtu jākoncentrē. Mēs bieži reģistrējam lietojumprogrammas datus, kas var ietvert metožu izsaukumu vai notikumu secību, lietotāja darbības vai pat kļūdas, kas var rasties, izpildot lietojumprogrammu. Ir daudz reģistrēšanas sistēmu, kuras jūs varētu izmantot, taču šajā rakstā mēs koncentrēsimies uz to, kā mēs varam reģistrēt pieprasījumus un atbildes ASP.NET Web API.

Pieprasījumu un atbilžu reģistrēšana Web API ir noderīga ienākošo un izejošo pakalpojumu zvanu atkļūdošanā, izsekošanā un pārbaudē. Reģistrējot visus pieprasījumus un atbildes vienuviet, problēmu noteikšana visos pieprasījumos un atbildēs kļūst vienkārša. Šajā ziņojumā mēs izveidosim pielāgotu ziņojumu apstrādātāju, lai uzraudzītu un reģistrētu pieprasījumus un atbildes Web API. Ziņojumu apstrādātājs tiks izmantots zvanu pārtveršanai un visu pieprasījumu un atbilžu reģistrēšanai centralizēti vienā vietā.

Stratēģijas, lai Web API radītu savstarpējas problēmas

Web API ir vairāki veidi, kā ievadīt mežizstrādi un citas transversālas problēmas. Viens no veidiem ir izveidot pielāgotu ApiController klasi vai bāzes klasi visiem mūsu kontrolieriem un pēc tam ignorēt ExecuteAsync metodi. Vēl viens veids ir izmantot pielāgotu darbību filtru. Tomēr abām šīm stratēģijām ir savi ierobežojumi. Pirmajā gadījumā mums būtu jānodrošina, lai visi mūsu kontrolieri paplašinātu pielāgoto bāzes kontrolieru klasi. Pēdējā gadījumā mums būtu jānodrošina, ka filtrs tiek piemērots visiem izmantotajiem kontrolleriem.

Labākā stratēģija, manuprāt, ir izmantot ziņojumu apstrādātāju, jo jūs to uzrakstāt tikai vienu reizi un pēc tam reģistrējat vienā vietā. Arī tāpēc, ka pielāgoto ziņojumu apstrādātājs tiks izsaukts daudz agrāk, t.i., pat pirms HttpControllerDispatcher, tas ir labi piemērots šķērsvirziena problēmu injicēšanai. Starp citu, ziņojumu apstrādātāji ir klases, kas manto abstrakto HttpMessageHandler klasi. Tādējādi mēs izmantosim ziņojumu apstrādātāja priekšrocības, lai injicētu mūsu pielāgoto reģistrētāju šajā ziņojumā.

Ja vēlaties izveidot un izpildīt šajā ierakstā redzamo avota kodu, sistēmā Visual Studio ir jābūt izveidotam un darbināmam. Jums vajadzētu būt instalētam arī NLog. Ja vēlaties uzzināt, kā instalēt, konfigurēt un izmantot NLog, apskatiet manu rakstu par NLog šeit.

Mūsu klientu reģistrētāja izveide Web API

Visual Studio izveidojiet jaunu Web API projektu un saglabājiet to ar vēlamo vārdu. Mēs šeit izmantosim pielāgotu deleģēšanas apstrādātāja priekšrocības, lai pārtvertu zvanus uz Web API. Vispirms izveidosim pielāgotu POCO klasi, kurā tiks glabāta visa informācija no mūsu pieprasījumiem un atbildēm.

publiskā klase LogMetadata

    {

publiskā virkne RequestContentType {get; komplekts; }

publiska virkne RequestUri {get; komplekts; }

publiskā virkne RequestMethod {get; komplekts; }

public DateTime? RequestTimestamp {get; komplekts; }

publiskā virkne ResponseContentType {get; komplekts; }

public HttpStatusCode ResponseStatusCode {get; komplekts; }

public DateTime? ResponseTimestamp {get; komplekts; }

    }

Tagad mēs ieviesīsim pielāgotu klasi ar nosaukumu LogHandler. Būtībā tas ir ziņojumu apstrādātājs, kas paplašina DelegatingHandler klasi.

publiskā klase CustomLogHandler: DelegatingHandler

    {

aizsargāts ignorēt asinhrono uzdevumu SendAsync (HttpRequestMessage pieprasījums, CancellationToken cancellationToken)

        {

atgriešanās bāze.SendAsync (pieprasījums, atcelšanaToken);

        }

    }

Šis koda fragments parāda, kā varat izveidot pieprasījuma metadatus. Šī metode tiks izsaukta no mūsu pielāgoto ziņojumu apstrādes metodes SendAsync, un tā atgriezīs klases LogMetadata instanci.

privāts LogMetadata BuildRequestMetadata (HttpRequestMessage pieprasījums)

    {

LogMetadata log = jauns LogMetadata

        {

RequestMethod = request.Method.Method,

RequestTimestamp = DateTime.Now,

RequestUri = request.RequestUri.ToString ()

        };

atgriešanās žurnāls;

    }

Nākamā lieta, kas mums jādara, ir atjaunināt žurnāla metadatu instanci ar informāciju no atbildes objekta. Lūk, kā to var panākt.

privātie LogMetadata BuildResponseMetadata (LogMetadata logMetadata, HttpResponseMessage atbilde)

    {

logMetadata.ResponseStatusCode = response.StatusCode;

logMetadata.ResponseTimestamp = DateTime.Now;

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

atgriešanās žurnālsMetadati;

    }

Šeit ir pilns pielāgotā ziņojumu apstrādātāja avota kods jūsu atsaucei.

publiskā klase CustomLogHandler: DelegatingHandler

    {

aizsargāts ignorēt asinhrono uzdevumu SendAsync (HttpRequestMessage pieprasījums, CancellationToken cancellationToken)

        {

var logMetadata = BuildRequestMetadata (pieprasījums);

var response = gaidīt bāzi.SendAsync (pieprasījums, cancellationToken);

logMetadata = BuildResponseMetadata (logMetadata, atbilde);

gaidīt SendToLog (logMetadata);

atbilde uz atgriešanos;

        }

privāts LogMetadata BuildRequestMetadata (HttpRequestMessage pieprasījums)

        {

LogMetadata log = jauns LogMetadata

            {

RequestMethod = request.Method.Method,

RequestTimestamp = DateTime.Now,

RequestUri = request.RequestUri.ToString ()

            };

atgriešanās žurnāls;

        }

privātie LogMetadata BuildResponseMetadata (LogMetadata logMetadata, HttpResponseMessage atbilde)

        {

logMetadata.ResponseStatusCode = response.StatusCode;

logMetadata.ResponseTimestamp = DateTime.Now;

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

atgriešanās žurnālsMetadati;

        }

privāts asinhronais uzdevums SendToLog (LogMetadata logMetadata)

        {

// TODO: ierakstiet kodu šeit, lai logMetadata instanci saglabātu iepriekš konfigurētā žurnālu krātuvē ...

atgriezties taisnība;

        }

    }

Ņemiet vērā, ka jums ir jāraksta nepieciešamais kods, lai saglabātu SendToLog metodē parādīto logMetadata gadījumu iepriekš konfigurētā žurnāla mērķī, t.i., failā vai datu bāzē. Es gribētu izmantot NLog, lai reģistrētu šos metadatus. Atkal jūs varat atsaukties uz manu rakstu par NLog, lai uzzinātu, kā to var izdarīt.

Reģistrē ziņojumu apstrādātāju

Lai reģistrētu pielāgoto ziņojumu apstrādātāju, varat izmantot Application_Start notikuma priekšrocības failā Global.asax.cs vai klases WebApiConfig reģistrēšanas metodi. Šis koda fragments parāda, kā jūs varat reģistrēt apdarinātāju, izmantojot WebApiConfig klases reģistrēšanas metodi.

public static void Register (HttpConfiguration config)

    {

// Šeit pierakstiet savu parasto kodu ...

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

    }

Šajā rakstā mēs pārbaudījām, kā mēs varam reģistrēt pieprasījumus un atbildes Web API, izmantojot pielāgotu ziņojumu apstrādātāju. Ziņojumu apstrādātāji ir lielisks veids, kā Web API cauruļvadā ievadīt savstarpējas problēmas. Lai gan mums ir citi veidi, kā ievadīt pieteikšanos Web API, piemēram, pielāgota ApiController klase vai pielāgotu darbību filtrs, pielāgota ziņojumu apstrādātāja izmantošana ir vienkāršāka pieeja. Varat nekautrēties pielāgot šo ieviešanu, pamatojoties uz savām prasībām, piemēram, lai pievienotu vairāk pielāgotu metadatu.

Kā darīt vairāk programmās ASP.NET un ASP.NET Core:

  • Kā izmantot atmiņas kešatmiņu ASP.NET Core
  • Kā rīkoties ar kļūdām ASP.NET Web API
  • Kā pārsūtīt vairākus parametrus Web API kontroliera metodēm
  • Kā reģistrēt pieprasījuma un atbildes metadatus ASP.NET Web API
  • Kā strādāt ar HttpModules ASP.NET
  • Uzlabota versiju veidošana ASP.NET Core Web API
  • Kā izmantot atkarības injekciju ASP.NET Core
  • Kā strādāt ar sesijām ASP.NET
  • Kā strādāt ar HTTPHandleriem ASP.NET
  • Kā izmantot IHostedService ASP.NET Core
  • Kā patērēt WCF SOAP pakalpojumu ASP.NET Core
  • Kā uzlabot ASP.NET Core lietojumprogrammu veiktspēju
  • Kā patērēt ASP.NET Core Web API, izmantojot RestSharp
  • Kā strādāt ar reģistrēšanos ASP.NET Core
  • Kā izmantot MediatR ASP.NET Core
  • Kā strādāt ar sesijas stāvokli ASP.NET Core
  • Kā Nancy izmantot ASP.NET Core
  • Izprotiet parametru saistīšanu ASP.NET Web API
  • Kā augšupielādēt failus ASP.NET Core MVC
  • Kā ieviest globālo izņēmumu apstrādi ASP.NET Core Web API
  • Kā ieviest veselības pārbaudes ASP.NET Core
  • Labākā prakse kešatmiņā ASP.NET
  • Kā izmantot Apache Kafka ziņojumapmaiņu .NET
  • Kā iespējot CORS savā tīmekļa API
  • Kad lietot WebClient pret HttpClient pret HttpWebRequest
  • Kā strādāt ar Redis kešatmiņu .NET
  • Kad .NET izmantot Task.WaitAll pret Task.WhenAll
$config[zx-auto] not found$config[zx-overlay] not found