Programování

Jak zpracovat chyby v ASP.NET Web API

Microsoft ASP.NET Web API je lehký rámec, který můžete použít k vytváření bezstavových služeb RESTful, které běží na HTTP. Výjimkou jsou chyby, ke kterým dochází za běhu, a zpracování výjimek je technika zpracování chyb za běhu v kódu aplikace.

Každý vývojář webového rozhraní API v ASP.NET by měl vědět, jak zacházet s výjimkami ve webovém rozhraní API a jak odesílat příslušné chybové kódy a chybové zprávy z metod řadiče webového rozhraní API. V následujících částech prozkoumáme, jak tyto úkoly provádět.

Použití HttpResponseException ve webovém rozhraní ASP.NET

Třídu HttpResponseException můžete použít k vrácení konkrétních stavových kódů HTTP a zpráv z metod kontroleru ve webovém rozhraní API. Zde je příklad.

veřejný zaměstnanec GetEmployee (int id)

{

Zaměstnanec emp = employeeRepository.Get (id);

if (emp == null)

    {

var response = new HttpResponseMessage (HttpStatusCode.NotFound)

        {

Content = new StringContent ("Employee doesn't exist", System.Text.Encoding.UTF8, "text / plain"),

StatusCode = HttpStatusCode.NotFound

        }

hodit novou HttpResponseException (odpověď);

    }

návrat emp;

}

Pokud vaše webové rozhraní API vrátí IHttpActionResult, možná budete chtít napsat metodu GetEmployee, jak je znázorněno níže.

public IHttpActionResult GetEmployee (int id)

{

Zaměstnanec emp = employeeRepository.Get (id);

if (emp == null)

    {

var response = new HttpResponseMessage (HttpStatusCode.NotFound)

        {

Content = new StringContent ("Employee doesn't exist", System.Text.Encoding.UTF8, "text / plain"),

StatusCode = HttpStatusCode.NotFound

        }

hodit novou HttpResponseException (odpověď);

    }

návrat Ok (emp);

}

Všimněte si, že chybový kód a chybová zpráva jsou přiřazeny objektu odpovědi a že instance HttpResponseException je vrácena, když dojde k výjimce v metodě akce řadiče webového rozhraní API.

Používání HttpError ve webovém rozhraní API ASP.NET

Můžete použít metodu rozšíření CreateErrorResponse v metodě webového rozhraní API k vrácení smysluplných chybových kódů a chybových zpráv. Všimněte si, že metoda CreateErrorResponse vytvoří objekt HttpError a poté jej zabalí do objektu HttpResponseMessage.

Následující výpis kódu ukazuje, jak můžete použít metodu rozšíření CreateErrorResponse z vaší metody akce webového kontroleru API.

public IActionResult GetEmployee (int id)

{

Zaměstnanec emp = employeeRepository.Get (id);

if (emp == null)

    {

string message = "Zaměstnanec neexistuje";

hodit novou HttpResponseException (

Request.CreateErrorResponse (HttpStatusCode.NotFound, zpráva));

    }

návrat Ok (emp);

}

Viz výše uvedená metoda GetEmployee (). Tato metoda přijímá ID zaměstnance jako parametr a používá toto ID k vyhledávání a načítání záznamů zaměstnanců pomocí instance úložiště zaměstnanců. Pokud nebyl nalezen záznam zaměstnance se zadaným ID zaměstnance, je vyvolána instance HttpResponseException. Všimněte si, jak jsou příslušná chybová zpráva a kód chyby vytvořeny před vyvoláním instance výjimky z metody řadiče webového rozhraní API.

Použití filtrů výjimek v ASP.NET Web API

Filtry výjimek jsou filtry, které lze použít ke zpracování neošetřených výjimek, které se generují v metodách vašeho webového rozhraní API. Jinými slovy můžete použít filtry výjimek k zachycení neošetřených výjimek ve webovém rozhraní API, které pocházejí z vašich metod řadiče. Všimněte si, že globální filtr chyb je dobrým přístupem ke zpracování výjimek ve vašem webovém rozhraní API, pokud jsou vyvolány neošetřené výjimky a nejsou zpracovány v metodách kontroleru.

Chcete-li vytvořit filtr výjimek, musíte implementovat rozhraní IExceptionFilter. Filtry výjimek můžete také vytvořit rozšířením abstraktní třídy ExceptionFilterAttribute a následným přepsáním metody OnException. Všimněte si, že abstraktní třída ExceptionFilterAttribute zase implementuje rozhraní IExceptionFilter.

Následující fragment kódu ukazuje, jak můžete vytvořit vlastní filtr výjimek rozšířením třídy ExceptionFilterAttribute a následným přepsáním metody OnException. Všimněte si, jak jsou standardní výjimky vyvolané metodami kontroleru zachyceny filtrem vlastních výjimek a poté převedeny na objekty HttpStatusResponse s příslušným HttpStatusCode.

veřejná třída CustomExceptionFilter: ExceptionFilterAttribute

    {

public override void OnException (HttpActionExecutedContext actionExecutedContext)

        {

HttpStatusCode status = HttpStatusCode.InternalServerError;

String message = String.Empty;

var exceptionType = actionExecutedContext.Exception.GetType ();

if (exceptionType == typeof (UnauthorizedAccessException))

            {

message = "Přístup k webovému rozhraní API není autorizován.";

status = HttpStatusCode.Unauthorized;

            }

else if (exceptionType == typeof (DivideByZeroException))

            {

message = "Interní chyba serveru.";

status = HttpStatusCode.InternalServerError;

            }

jiný

            {

message = "Nebylo nalezeno.";

status = HttpStatusCode.NotFound;

            }

actionExecutedContext.Response = nový HttpResponseMessage ()

            {

Content = new StringContent (message, System.Text.Encoding.UTF8, "text / plain"),

StatusCode = stav

            };

base.OnException (actionExecutedContext);

        }

    }

Měli byste přidat vlastní filtr výjimek do kolekce filtrů objektu HttpConfiguration.

public static void Register (HttpConfiguration config)

        {

config.MapHttpAttributeRoutes ();

config.Routes.MapHttpRoute (

name: "DefaultApi",

routeTemplate: "api / {controller} / {id}",

výchozí: nový {id = RouteParameter.Optional}

            );

config.Formatters.Remove (config.Formatters.XmlFormatter);

config.Filters.Add (nový CustomExceptionFilter ());

        }

Filtry výjimek můžete zaregistrovat jedním z následujících tří způsobů:

  • Na akční úrovni
  • Na úrovni řadiče
  • Globálně

Následující fragment kódu ukazuje, jak můžete použít filtr na úrovni akce, tj. Na metodu akce kontroleru.

public class EmployeesController: ApiController

{

[NotImplementedExceptionFilter]

veřejný zaměstnanec GetEmployee (int id)

    {

hodit nový NotImplementedException ();

    }

}

Chcete-li použít filtr výjimek na úrovni řadiče, budete muset použít atribut filtru na úrovni třídy, jak je uvedeno níže.

[DatabaseExceptionFilter]

public class EmployeesController: ApiController

{

// Nějaký kód

}

Můžete také globálně použít vlastní filtr výjimek, aby fungoval pro všechny řadiče webového rozhraní API. Takto to můžete udělat.

GlobalConfiguration.Configuration.Filters.Add (new DatabaseExceptionFilterAttribute ());

Následující fragment kódu ukazuje, jak můžete použít vlastní filtr výjimek, který jsme vytvořili dříve, na vaši metodu řadiče.

[CustomExceptionFilter]

public IEnumerable Get ()

 {

hodit novou DivideByZeroException ();

 }

Webové rozhraní API ASP.NET podporuje použití HttpResponseException ke zpracování výjimek jak na úrovni řadiče, tak na úrovni akce. Když metoda akce ve webovém rozhraní API vyvolá nezachycenou výjimku, výjimka se přeloží na stavový kód HTTP 500, tj. „Interní chyba serveru“. Pokud používáte HttpResponseException, můžete určit stavový kód, který chcete vrátit v konstruktoru třídy HttpResponseException. Tímto způsobem můžete přizpůsobit své chybové kódy, aby byly smysluplnější.

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