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