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