Programmering

Hvordan håndtere feil i ASP.NET Web API

Microsofts ASP.NET Web API er et lett rammeverk du kan bruke til å bygge statsløse RESTful-tjenester som kjører på HTTP. Unntak er feil som oppstår ved kjøretid, og unntakshåndtering er teknikken for å håndtere kjøretidsfeil i applikasjonskoden.

Hver ASP.NET Web API-utvikler bør vite hvordan man håndterer unntak i Web API og hvordan man sender ut riktige feilkoder og feilmeldinger fra Web API-kontrolleringsmetoder. Vi vil undersøke hvordan du utfører disse oppgavene i avsnittene nedenfor.

Bruker HttpResponseException i ASP.NET Web API

Du kan bruke klassen HttpResponseException til å returnere spesifikke HTTP-statuskoder og meldinger fra kontrolleringsmetodene dine i Web API. Her er et eksempel.

offentlig ansatt GetEmployee (int id)

{

Employee emp = employeeRepository.Get (id);

hvis (emp == null)

    {

var respons = ny HttpResponseMessage (HttpStatusCode.NotFound)

        {

Innhold = ny StringContent ("Ansatt eksisterer ikke", System.Text.Encoding.UTF8, "text / plain"),

StatusCode = HttpStatusCode.NotFound

        }

kaste nye HttpResponseException (respons);

    }

retur emp;

}

Hvis Web API-en din returnerer IHttpActionResult, vil du kanskje skrive GetEmployee-metoden som vist nedenfor.

offentlig IHttpActionResult GetEmployee (int id)

{

Employee emp = employeeRepository.Get (id);

hvis (emp == null)

    {

var respons = ny HttpResponseMessage (HttpStatusCode.NotFound)

        {

Innhold = ny StringContent ("Ansatt eksisterer ikke", System.Text.Encoding.UTF8, "text / plain"),

StatusCode = HttpStatusCode.NotFound

        }

kaste nye HttpResponseException (respons);

    }

returnere Ok (emp);

}

Merk at feilkoden og feilmeldingen er tilordnet til svarobjektet, og at en forekomst av HttpResponseException returneres når et unntak oppstår i handlingsmetoden til Web API-kontrolleren.

Bruker HttpError i ASP.NET Web API

Du kan bruke CreateErrorResponse-utvidelsesmetoden i Web API-kontrollermetoden for å returnere meningsfulle feilkoder og feilmeldinger. Merk at CreateErrorResponse-metoden oppretter et HttpError-objekt og deretter bryter det inn i et HttpResponseMessage-objekt.

Følgende kodeliste illustrerer hvordan du kan bruke CreateErrorResponse-utvidelsesmetoden fra handlingsmetoden Web API-kontroller.

offentlig IActionResult GetEmployee (int id)

{

Employee emp = employeeRepository.Get (id);

hvis (emp == null)

    {

string message = "Ansatt eksisterer ikke";

kast nytt HttpResponseException (

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

    }

returnere Ok (emp);

}

Se GetEmployee () -metoden vist ovenfor. Denne metoden godtar en medarbeider-ID som parameter og bruker denne ID-en til å søke og hente en ansatt-post ved hjelp av forekomsten av ansattes arkiv. Hvis en ansattpost med den angitte medarbeider-IDen ikke blir funnet, kastes en forekomst av HttpResponseException. Legg merke til hvordan riktig feilmelding og feilkode er konstruert før unntaksforekomsten kastes fra Web API-kontrollermetoden.

Bruker unntaksfiltre i ASP.NET Web API

Unntaksfiltre er filtre som kan brukes til å håndtere unhandledte unntak som genereres i Web API-kontrollermetodene. Med andre ord, du kan bruke unntaksfiltre til å fange ubehandlede unntak i Web API som stammer fra kontrollermetodene dine. Vær oppmerksom på at et globalt feilfilter er en god tilnærming til å håndtere unntak i web-API-et ditt hvis ubehandlede unntak blir kastet og ikke håndteres i kontrollermetodene dine.

For å opprette et unntaksfilter, må du implementere IExceptionFilter-grensesnittet. Du kan også opprette unntaksfiltre ved å utvide den abstrakte klassen ExceptionFilterAttribute og deretter overstyre OnException-metoden. Merk at ExceptionFilterAttribute-abstraktklassen i sin tur implementerer IExceptionFilter-grensesnittet.

Følgende kodebit illustrerer hvordan du kan opprette et tilpasset unntaksfilter ved å utvide ExceptionFilterAttribute-klassen og deretter overstyre OnException-metoden. Legg merke til hvordan standard unntak fra kontrollermetodene dine blir fanget opp av det tilpassede unntaksfilteret og deretter konvertert til HttpStatusResponse-objekter med riktig HttpStatusCode.

offentlig klasse CustomExceptionFilter: ExceptionFilterAttribute

    {

offentlig overstyring ugyldig OnException (HttpActionExecutedContext actionExecutedContext)

        {

HttpStatusCode status = HttpStatusCode.InternalServerError;

Strengmelding = String.Empty;

var exceptionType = actionExecutedContext.Exception.GetType ();

hvis (exceptionType == typeof (UnauthorizedAccessException))

            {

message = "Tilgang til Web API er ikke autorisert.";

status = HttpStatusCode.Unauthorized;

            }

annet hvis (exceptionType == typeof (DivideByZeroException))

            {

message = "Intern serverfeil.";

status = HttpStatusCode.InternalServerError;

            }

ellers

            {

message = "Ikke funnet.";

status = HttpStatusCode.NotFound;

            }

actionExecutedContext.Response = ny HttpResponseMessage ()

            {

Innhold = ny StringContent (melding, System.Text.Encoding.UTF8, "tekst / vanlig"),

StatusCode = status

            };

base.OnException (actionExecutedContext);

        }

    }

Du bør legge til det egendefinerte unntaksfilteret i filtersamlingen til HttpConfiguration-objektet.

public static void Register (HttpConfiguration config)

        {

config.MapHttpAttributeRoutes ();

config.Routes.MapHttpRoute (

navn: "DefaultApi",

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

standardinnstillinger: ny {id = RouteParameter.Optional}

            );

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

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

        }

Du kan registrere unntaksfiltrene dine på en av følgende tre måter:

  • På handlingsnivå
  • På kontrollernivå
  • Globalt

Følgende kodebit viser hvordan du kan bruke et filter på handlingsnivå, dvs. til handlingsmetoden din.

offentlig klasse StaffController: ApiController

{

[NotImplementedExceptionFilter]

offentlig ansatt GetEmployee (int id)

    {

kaste nye NotImplementedException ();

    }

}

For å bruke unntaksfilteret på kontrollernivå, må du bruke filterattributtet på klassenivå som vist nedenfor.

[DatabaseExceptionFilter]

offentlig klasse StaffController: ApiController

{

// Noe kode

}

Du kan også bruke ditt tilpassede unntaksfilter globalt, slik at det fungerer for alle Web API-kontrollere. Slik kan du gjøre dette.

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

Følgende kodebit illustrerer hvordan du kan bruke det egendefinerte unntaksfilteret vi opprettet tidligere på kontrolleren din.

[CustomExceptionFilter]

offentlig IEnumerable Get ()

 {

kaste nye DivideByZeroException ();

 }

ASP.NET Web API støtter bruken av HttpResponseException for å håndtere unntak både på kontrollernivå og på handlingsnivå. Når en handlingsmetode i Web API kaster et ufanget unntak, oversettes unntaket til HTTP-statuskode 500, dvs. "Intern serverfeil." Hvis du bruker HttpResponseException, kan du spesifisere statuskoden du vil returnere i konstruktøren til HttpResponseException-klassen. På denne måten kan du tilpasse feilkodene dine for å gjøre dem mer meningsfylte.

Hvordan gjøre mer i ASP.NET og ASP.NET Core:

  • Hvordan bruke hurtigbufring i minnet i ASP.NET Core
  • Hvordan håndtere feil i ASP.NET Web API
  • Hvordan overføre flere parametere til Web API-kontrollermetoder
  • Hvordan logge forespørsels- og svarmetadata i ASP.NET Web API
  • Hvordan jobbe med HttpModules i ASP.NET
  • Avansert versjonering i ASP.NET Core Web API
  • Hvordan bruke avhengighetsinjeksjon i ASP.NET Core
  • Hvordan jobbe med økter i ASP.NET
  • Hvordan jobbe med HTTPHandlers i ASP.NET
  • Hvordan bruke IHostedService i ASP.NET Core
  • Hvordan forbruke en WCF SOAP-tjeneste i ASP.NET Core
  • Hvordan forbedre ytelsen til ASP.NET Core-applikasjoner
  • Slik bruker du et ASP.NET Core Web API ved hjelp av RestSharp
  • Hvordan jobbe med innlogging i ASP.NET Core
  • Hvordan bruke MediatR i ASP.NET Core
  • Hvordan jobbe med økttilstand i ASP.NET Core
  • Hvordan bruke Nancy i ASP.NET Core
  • Forstå parameterinnbinding i ASP.NET Web API
  • Hvordan laste opp filer i ASP.NET Core MVC
  • Hvordan implementere global unntaksbehandling i ASP.NET Core Web API
  • Hvordan implementere helsesjekker i ASP.NET Core
  • Beste fremgangsmåter for hurtigbufring i ASP.NET
  • Hvordan bruke Apache Kafka-meldinger i .NET
  • Hvordan aktivere CORS på web-API-et
  • Når skal du bruke WebClient vs. HttpClient vs. HttpWebRequest
  • Hvordan jobbe med Redis Cache i .NET
  • Når skal jeg bruke Task.WaitAll vs. Task.WhenAll i .NET
$config[zx-auto] not found$config[zx-overlay] not found