Programmering

Sådan håndteres fejl i ASP.NET Web API

Microsofts ASP.NET Web API er en letvægtsramme, du kan bruge til at opbygge statsløse RESTful-tjenester, der kører på HTTP. Undtagelser er fejl, der opstår ved kørsel, og undtagelseshåndtering er teknikken til håndtering af kørselsfejl i din applikationskode.

Hver ASP.NET Web API-udvikler skal vide, hvordan man håndterer undtagelser i Web API, og hvordan man sender passende fejlkoder og fejlmeddelelser fra Web API-controller-metoder. Vi vil undersøge, hvordan du udfører disse opgaver i nedenstående afsnit.

Brug af HttpResponseException i ASP.NET Web API

Du kan bruge klassen HttpResponseException til at returnere specifikke HTTP-statuskoder og meddelelser fra dine controllermetoder i Web API. Her er et eksempel.

offentlig medarbejder GetEmployee (int id)

{

Medarbejder emp = workerRepository.Get (id);

hvis (emp == null)

    {

var respons = ny HttpResponseMessage (HttpStatusCode.NotFound)

        {

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

StatusCode = HttpStatusCode.NotFound

        }

smid nyt HttpResponseException (svar);

    }

returner emp;

}

Hvis din Web API returnerer IHttpActionResult, vil du måske skrive GetEmployee-metoden som vist nedenfor.

offentlig IHttpActionResult GetEmployee (int id)

{

Medarbejder emp = medarbejderRepository.Get (id);

hvis (emp == null)

    {

var respons = ny HttpResponseMessage (HttpStatusCode.NotFound)

        {

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

StatusCode = HttpStatusCode.NotFound

        }

smid nyt HttpResponseException (svar);

    }

returnere Ok (emp);

}

Bemærk, at fejlkoden og fejlmeddelelsen tildeles responsobjektet, og at en forekomst af HttpResponseException returneres, når en undtagelse forekommer i handlingsmetoden til Web API-controlleren.

Brug af HttpError i ASP.NET Web API

Du kan bruge CreateErrorResponse-udvidelsesmetoden i din Web API-controller-metode til at returnere meningsfulde fejlkoder og fejlmeddelelser. Bemærk, at metoden CreateErrorResponse opretter et HttpError-objekt og derefter pakker det ind i et HttpResponseMessage-objekt.

Følgende kodeliste illustrerer, hvordan du kan bruge CreateErrorResponse-udvidelsesmetoden fra din handlingsmetode til Web API-controller.

offentlig IActionResult GetEmployee (int id)

{

Medarbejder emp = workerRepository.Get (id);

hvis (emp == null)

    {

string message = "Medarbejder findes ikke";

smid ny HttpResponseException (

Request.CreateErrorResponse (HttpStatusCode.NotFound, besked));

    }

returnere Ok (emp);

}

Se GetEmployee () -metoden vist ovenfor. Denne metode accepterer et medarbejder-id som en parameter og bruger dette id til at søge og hente en medarbejderpost ved hjælp af medarbejderregistreringsinstansen. Hvis en medarbejderregistrering med det specificerede medarbejder-id ikke findes, kastes en forekomst af HttpResponseException. Bemærk, hvordan den relevante fejlmeddelelse og fejlkode er konstrueret, før undtagelsesforekomsten kastes fra Web API-controller-metoden.

Brug af undtagelsesfiltre i ASP.NET Web API

Undtagelsesfiltre er filtre, der kan bruges til at håndtere undtagelser, der ikke håndteres, der genereres i dine Web API-controller-metoder. Med andre ord kan du bruge undtagelsesfiltre til at fange uhåndterede undtagelser i Web API, der stammer fra dine controller-metoder. Bemærk, at et globalt fejlfilter er en god tilgang til håndtering af undtagelser i din Web API, hvis ikke-håndterede undtagelser kastes og ikke håndteres i dine controller-metoder.

For at oprette et undtagelsesfilter skal du implementere IExceptionFilter-grænsefladen. Du kan også oprette undtagelsesfiltre ved at udvide den abstrakte klasse ExceptionFilterAttribute og derefter tilsidesætte OnException-metoden. Bemærk, at ExceptionFilterAttribute-abstraktklassen igen implementerer IExceptionFilter-grænsefladen.

Følgende kodestykke illustrerer, hvordan du kan oprette et brugerdefineret undtagelsesfilter ved at udvide klassen ExceptionFilterAttribute og derefter tilsidesætte OnException-metoden. Bemærk, hvordan standardundtagelserne fra dine controller-metoder fanges af det tilpassede undtagelsesfilter og derefter konverteres til HttpStatusResponse-objekter med den relevante HttpStatusCode.

offentlig klasse CustomExceptionFilter: ExceptionFilterAttribute

    {

offentlig tilsidesættelse ugyldigt OnException (HttpActionExecutedContext actionExecutedContext)

        {

HttpStatusCode status = HttpStatusCode.InternalServerError;

Strengmeddelelse = String.Empty;

var exceptionType = actionExecutedContext.Exception.GetType ();

hvis (exceptionType == typeof (UnauthorizedAccessException))

            {

message = "Adgang til Web API er ikke autoriseret.";

status = HttpStatusCode.Unauthorized;

            }

ellers hvis (exceptionType == typeof (DivideByZeroException))

            {

message = "Intern serverfejl.";

status = HttpStatusCode.InternalServerError;

            }

andet

            {

message = "Ikke fundet.";

status = HttpStatusCode.NotFound;

            }

actionExecutedContext.Response = ny HttpResponseMessage ()

            {

Indhold = ny StringContent (meddelelse, System.Text.Encoding.UTF8, "tekst / almindelig"),

StatusCode = status

            };

base.OnException (actionExecutedContext);

        }

    }

Du skal tilføje det brugerdefinerede undtagelsesfilter til filtersamlingen af ​​HttpConfiguration-objektet.

offentligt statisk ugyldigt register (HttpConfiguration config)

        {

config.MapHttpAttributeRoutes ();

config.Routes.MapHttpRoute (

navn: "StandardApi",

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

standardindstillinger: ny {id = RouteParameter.Optional}

            );

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

config.Filters.Add (ny CustomExceptionFilter ());

        }

Du kan registrere dine undtagelsesfiltre på en af ​​følgende tre måder:

  • På handlingsniveau
  • På controllerniveau
  • Globalt

Følgende kodestykke viser, hvordan du kan anvende et filter på handlingsniveau, dvs. på din controllerhandlingsmetode.

offentlig klasse StaffController: ApiController

{

[NotImplementedExceptionFilter]

offentlig medarbejder GetEmployee (int id)

    {

smid ny NotImplementedException ();

    }

}

For at anvende undtagelsesfilteret på controllerniveau skal du bruge filterattributten på klasseniveau som vist nedenfor.

[DatabaseExceptionFilter]

offentlig klasse StaffController: ApiController

{

// Noget kode

}

Du kan også anvende dit tilpassede undtagelsesfilter globalt, så det fungerer for alle Web API-controllere. Sådan kan du gøre dette.

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

Følgende kodestykke illustrerer, hvordan du kan anvende det brugerdefinerede undtagelsesfilter, vi oprettede tidligere, på din controller-metode.

[CustomExceptionFilter]

offentlig IEnumerable Get ()

 {

smid nyt DivideByZeroException ();

 }

ASP.NET Web API understøtter brugen af ​​HttpResponseException til at håndtere undtagelser både på controllerniveau og på handlingsniveau. Når en handlingsmetode i Web API kaster en ikke-fanget undtagelse, oversættes undtagelsen til HTTP-statuskode 500, dvs. "Intern serverfejl." Hvis du bruger HttpResponseException, kan du angive den statuskode, du vil returnere i konstruktøren af ​​HttpResponseException-klassen. På denne måde kan du tilpasse dine fejlkoder for at gøre dem mere meningsfulde.

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