Programování

Jak protokolovat metadata požadavků a odpovědí ve webovém rozhraní API ASP.NET

Stejně jako ověřování, ukládání do mezipaměti a správa výjimek je protokolování průřezovým problémem - funkcí, která ovlivňuje celou aplikaci -, která by měla být centralizována. Často protokolováme data aplikace, která mohou zahrnovat posloupnost volání metody nebo události, akce uživatele nebo dokonce chyby, které mohou nastat při spuštění aplikace. Existuje mnoho rámců protokolování, které byste mohli využít, ale v tomto článku se zaměříme na to, jak můžeme protokolovat požadavky a odpovědi ve webovém rozhraní ASP.NET.

Protokolování požadavků a odpovědí ve webovém rozhraní API je užitečné při ladění, trasování a kontrole příchozích a odchozích volání služby. Zaznamenáním všech požadavků a odpovědí na jednom místě je detekce problémů v jakýchkoli požadavcích a odpovědích snadná. V tomto příspěvku vytvoříme vlastní obslužný program zpráv, který bude monitorovat a protokolovat požadavky a odpovědi ve webovém rozhraní API. Obsluha zpráv se použije k zachycení hovorů a centrálnímu protokolování všech požadavků a odpovědí na jednom místě.

Strategie pro vložení průřezových obav do webového API

Existuje několik způsobů, jak vložit webové protokolování a další problémy s průřezem do webového rozhraní API. Jedním ze způsobů je vytvořit vlastní třídu ApiController nebo základní třídu pro všechny naše řadiče a poté přepsat metodu ExecuteAsync. Další možností je použít vlastní filtr akcí. Obě tyto strategie však mají svá omezení. V prvním případě bychom museli zajistit, aby všechny naše řadiče rozšířily třídu vlastních základních řadičů. V druhém případě bychom museli zajistit, aby byl filtr aplikován na všechny řadiče, které používáme.

Nejlepší strategie je podle mého názoru použít obslužnou rutinu zpráv, protože ji napíšete pouze jednou a poté ji zaregistrujete na jednom místě. Také proto, že vlastní obslužná rutina zpráv bude volána mnohem dříve v potrubí, tj. Ještě před HttpControllerDispatcher, je vhodná pro vkládání obav o průřez. Mimochodem, obslužné rutiny zpráv jsou třídy, které dědí abstraktní třídu HttpMessageHandler. Proto v tomto příspěvku využijeme obsluhu zprávy k vložení vlastního záznamníku.

Pokud chcete vytvořit a spustit zdrojový kód ilustrovaný v tomto příspěvku, měli byste mít ve svém systému spuštěnou Visual Studio. Také byste měli mít nainstalovaný NLog. Pokud chcete vědět, jak nainstalovat, konfigurovat a používat NLog, podívejte se na můj článek o NLogu zde.

Vytváření našeho záznamníku zákazníků pro webové rozhraní API

Vytvořte nový projekt webového rozhraní API v sadě Visual Studio a uložte jej s požadovaným názvem. Budeme zde využívat vlastní delegující obslužnou rutinu k zachycení volání webového rozhraní API. Nejprve si vytvořme vlastní třídu POCO, která bude ukládat všechny informace z našich požadavků a odpovědí.

veřejná třída LogMetadata

    {

public string RequestContentType {get; soubor; }

veřejný řetězec RequestUri {get; soubor; }

veřejný řetězec RequestMethod {get; soubor; }

veřejné datum a čas? RequestTimestamp {get; soubor; }

public string ResponseContentType {get; soubor; }

public HttpStatusCode ResponseStatusCode {get; soubor; }

veřejné datum a čas? ResponseTimestamp {get; soubor; }

    }

Nyní implementujeme vlastní třídu nazvanou LogHandler. Toto je v podstatě obslužná rutina zprávy, která rozšiřuje třídu DelegatingHandler.

veřejná třída CustomLogHandler: DelegatingHandler

    {

chráněné přepsání asynchronní úloha SendAsync (požadavek HttpRequestMessage, CancellationToken CancelToken)

        {

návrat base.SendAsync (požadavek, zrušeníToken);

        }

    }

Následující fragment kódu ukazuje, jak můžete vytvořit metadata požadavku. Tato metoda bude volána z metody SendAsync naší vlastní obslužné rutiny zpráv a vrátí instanci třídy LogMetadata.

soukromá LogMetadata BuildRequestMetadata (požadavek HttpRequestMessage)

    {

LogMetadata log = nová LogMetadata

        {

RequestMethod = request.Method.Method,

RequestTimestamp = DateTime.Now,

RequestUri = request.RequestUri.ToString ()

        };

návratový protokol;

    }

Další věc, kterou musíme udělat, je aktualizovat instanci metadat protokolu pomocí informací z objektu odpovědi. Tady lze dosáhnout.

soukromá LogMetadata BuildResponseMetadata (LogMetadata logMetadata, odpověď HttpResponseMessage)

    {

logMetadata.ResponseStatusCode = response.StatusCode;

logMetadata.ResponseTimestamp = DateTime.Now;

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

vrátit logMetadata;

    }

Zde je kompletní zdrojový kód obslužné rutiny vlastní zprávy pro vaši referenci.

veřejná třída CustomLogHandler: DelegatingHandler

    {

chráněné přepsání asynchronní úloha SendAsync (požadavek HttpRequestMessage, CancellationToken CancelToken)

        {

var logMetadata = BuildRequestMetadata (požadavek);

var response = await base.SendAsync (požadavek, zrušeníToken);

logMetadata = BuildResponseMetadata (logMetadata, odpověď);

čekat SendToLog (logMetadata);

návratová odpověď;

        }

soukromá LogMetadata BuildRequestMetadata (požadavek HttpRequestMessage)

        {

LogMetadata log = nová LogMetadata

            {

RequestMethod = request.Method.Method,

RequestTimestamp = DateTime.Now,

RequestUri = request.RequestUri.ToString ()

            };

návratový protokol;

        }

soukromá LogMetadata BuildResponseMetadata (LogMetadata logMetadata, odpověď HttpResponseMessage)

        {

logMetadata.ResponseStatusCode = response.StatusCode;

logMetadata.ResponseTimestamp = DateTime.Now;

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

vrátit logMetadata;

        }

soukromá asynchronní úloha SendToLog (LogMetadata logMetadata)

        {

// TODO: Sem napište kód pro uložení instance logMetadata do předem nakonfigurovaného úložiště protokolů ...

návrat true;

        }

    }

Všimněte si, že musíte napsat potřebný kód pro uložení instance logMetadata zobrazené v metodě SendToLog do předem nakonfigurovaného cíle protokolu, tj. Souboru nebo databáze. Dávám přednost použití NLog k přihlášení těchto metadat. Opět se můžete podívat na můj článek o NLogu, abyste zjistili, jak toho lze dosáhnout.

Registrace obslužné rutiny zprávy

Chcete-li zaregistrovat obslužnou rutinu vlastní zprávy, můžete využít výhodu Application_Start události v souboru Global.asax.cs nebo metodu Register třídy WebApiConfig. Následující fragment kódu ukazuje, jak můžete zaregistrovat obslužnou rutinu pomocí metody Register třídy WebApiConfig.

public static void Register (HttpConfiguration config)

    {

// Sem napište obvyklý kód ...

config.MessageHandlers.Add (nový CustomLogHandler ());

    }

V tomto článku jsme zkoumali, jak můžeme protokolovat požadavky a odpovědi ve webovém rozhraní API pomocí vlastní obslužné rutiny zpráv. Obslužné rutiny zpráv jsou vynikajícím způsobem, jak do kanálu webového rozhraní API vložit problémy s křížením. I když máme další způsoby, jak vkládat protokolování do webového rozhraní API, například vlastní třídu ApiController nebo vlastní filtr akcí, je použití vlastního zpracování zpráv jednodušší. Tuto implementaci můžete vyladit na základě svých požadavků, například přidat další vlastní metadata.

Jak udělat více v ASP.NET a ASP.NET Core:

  • Jak používat ukládání do mezipaměti v paměti ASP.NET Core
  • Jak zpracovat chyby v ASP.NET Web API
  • Jak předat více parametrů metodám webového kontroleru API
  • Jak protokolovat metadata požadavků a odpovědí ve webovém rozhraní API ASP.NET
  • Jak pracovat s HttpModules v ASP.NET
  • Pokročilé správy verzí v ASP.NET Core Web API
  • Jak používat vkládání závislostí v ASP.NET Core
  • Jak pracovat s relacemi v ASP.NET
  • Jak pracovat s HTTPHandlers v ASP.NET
  • Jak používat IHostedService v ASP.NET Core
  • Jak využívat službu WCF SOAP v ASP.NET Core
  • Jak zlepšit výkon aplikací ASP.NET Core
  • Jak konzumovat webové rozhraní API ASP.NET Core pomocí RestSharp
  • Jak pracovat s protokolováním v ASP.NET Core
  • Jak používat MediatR v ASP.NET Core
  • Jak pracovat se stavem relace v ASP.NET Core
  • Jak používat Nancy v ASP.NET Core
  • Vysvětlení vazby parametrů v ASP.NET Web API
  • Jak nahrávat soubory v ASP.NET Core MVC
  • Jak implementovat globální zpracování výjimek ve webovém rozhraní API ASP.NET Core
  • Jak implementovat kontroly stavu v ASP.NET Core
  • Osvědčené postupy při ukládání do mezipaměti v ASP.NET
  • Jak používat zasílání zpráv Apache Kafka v .NET
  • Jak povolit CORS ve vašem webovém rozhraní API
  • Kdy použít WebClient vs. HttpClient vs. HttpWebRequest
  • Jak pracovat s Redis Cache v .NET
  • Kdy použít Task.WaitAll vs. Task.WhenAll v .NET
$config[zx-auto] not found$config[zx-overlay] not found