Kako postupati s pogreškama u ASP.NET web API-ju

Microsoftov ASP.NET Web API lagan je okvir koji možete koristiti za izgradnju RESTful usluga bez državljanstva koje se izvode na HTTP-u. Iznimke su pogreške koje se javljaju u vrijeme izvođenja, a rukovanje iznimkama je tehnika rukovanja pogreškama u izvršavanju u kodu vaše aplikacije.

Svaki programer ASP.NET Web API-a trebao bi znati kako se nositi s iznimkama u Web API-ju i kako poslati odgovarajuće kodove pogrešaka i poruke o pogreškama iz metoda kontrolera Web API-ja. Ispitati ćemo kako izvoditi ove zadatke u odjeljcima u nastavku. 

Korištenje HttpResponseException u ASP.NET web API-ju

Klasu HttpResponseException možete koristiti za vraćanje određenih HTTP kodova statusa i poruka iz vaših metoda kontrolera u Web API-ju. Evo primjera.

javni zaposlenik GetEfficiee (int id)

{

    Zaposlenik emp = workerRepository.Get (id);

    ako (emp == null)

    {

        var odgovor = nova HttpResponseMessage (HttpStatusCode.NotFound)

        {

            Sadržaj = novi StringContent ("Zaposlenik ne postoji", System.Text.Encoding.UTF8, "text / plain"),

            StatusCode = HttpStatusCode.NotFound

        }

        baciti novi HttpResponseException (odgovor);

    }

    vratiti emp;

}

Ako vaš web API vrati IHttpActionResult, možda ćete htjeti napisati metodu GetEfficiee kako je prikazano u nastavku.

javni IHttpActionResult GetEfficiee (int id)

{

    Zaposlenik emp = workerRepository.Get (id);

    ako (emp == null)

    {

        var odgovor = nova HttpResponseMessage (HttpStatusCode.NotFound)

        {

            Sadržaj = novi StringContent ("Zaposlenik ne postoji", System.Text.Encoding.UTF8, "text / plain"),

            StatusCode = HttpStatusCode.NotFound

        }

        baciti novi HttpResponseException (odgovor);

    }

    povratak Ok (emp);

}

Imajte na umu da su objekt pogreške dodijeljeni kôd pogreške i poruka o pogrešci te da se instanca HttpResponseException vraća kada se u akcijskoj metodi kontrolera Web API dogodi iznimka.

Korištenje HttpError u ASP.NET Web API

Možete koristiti metodu proširenja CreateErrorResponse u metodi vašeg web API kontrolera za vraćanje značajnih kodova pogrešaka i poruka o pogreškama. Imajte na umu da metoda CreateErrorResponse stvara objekt HttpError, a zatim ga umotava u objekt HttpResponseMessage.

Sljedeći popis kodova ilustrira kako možete koristiti metodu proširenja CreateErrorResponse iz metode radnje regulatora Web API-ja.

javni IActionResult GetEfficiee (int id)

{

    Zaposlenik emp = workerRepository.Get (id);

    ako (emp == null)

    {

       string message = "Zaposlenik ne postoji";

        baci novi HttpResponseException (

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

    }

    povratak Ok (emp);

}

Pogledajte gore prikazanu metodu GetEfficiee (). Ova metoda prihvaća ID zaposlenika kao parametar i koristi ga za traženje i dohvaćanje zapisa zaposlenika pomoću instance spremišta zaposlenika. Ako zapis zaposlenika koji ima navedeni ID zaposlenika nije pronađen, bacit će se instanca HttpResponseException. Primijetite kako se konstruiraju odgovarajuća poruka o pogrešci i kôd pogreške prije nego što se izuzetak izbaci iz metode kontrolera Web API-ja.

Korištenje filtara za iznimke u ASP.NET Web API-ju

Filtri za iznimke su filtri koji se mogu koristiti za rukovanje neobrađenim iznimkama koje se generiraju u metodama vašeg web API kontrolera. Drugim riječima, možete koristiti filtre za iznimke da biste uhvatili neobrađene iznimke u web API-ju koje potječu od vaših metoda kontrolera. Imajte na umu da je globalni filtar pogrešaka dobar pristup za rukovanje iznimkama u vašem web API-ju ako se neobrađene iznimke bace i ne obrađuju u metodama vašeg kontrolera.

Da biste stvorili filtar iznimke, morate implementirati sučelje IExceptionFilter. Također možete stvoriti filtre za iznimke tako što ćete proširiti apstraktnu klasu ExceptionFilterAttribute, a zatim nadjačati metodu OnException. Imajte na umu da sažetak klase ExceptionFilterAttribute implementira sučelje IExceptionFilter.

Sljedeći isječak koda ilustrira kako možete stvoriti prilagođeni filtar iznimke proširivanjem klase ExceptionFilterAttribute, a zatim nadjačavanjem metode OnException. Obratite pažnju na to kako prilagođene filtre iznimki hvata standardne iznimke koje bacaju vaše metode kontrolera, a zatim ih pretvaraju u objekte HttpStatusResponse s odgovarajućim HttpStatusCode.

javna klasa CustomExceptionFilter: ExceptionFilterAttribute

    {

        javno nadjačavanje void OnException (HttpActionExecutedContext actionExecutedContext)

        {

            HttpStatusCode status = HttpStatusCode.InternalServerError;

            String poruka = ​​String.Empty;

            var exceptionType = actionExecutedContext.Exception.GetType ();

            if (exceptionType == typeof (UnauthorizedAccessException))

            {

                message = "Pristup web API-ju nije odobren.";

                status = HttpStatusCode.Neovlašteno;

            }

            inače ako (typeTyp == typeof (DivideByZeroException))

            {

                message = "Interna pogreška poslužitelja.";

                status = HttpStatusCode.InternalServerError;

            }

            drugo

            {

                message = "Nije pronađeno.";

                status = HttpStatusCode.NotFound;

            }

            actionExecutedContext.Response = novo HttpResponseMessage ()

            {

                Sadržaj = novi StringContent (poruka, System.Text.Encoding.UTF8, "text / plain"),

                StatusCode = status

            };

            base.OnException (actionExecutedContext);

        }

    }

Trebali biste dodati prilagođeni filtar iznimke u zbirku filtara objekta HttpConfiguration.

javni statički void Registar (HttpConfiguration config)

        {

            config.MapHttpAttributeRoutes ();

            config.Routes.MapHttpRoute (

                ime: "DefaultApi",

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

                zadane vrijednosti: novo {id = RouteParameter.O optional}

            );

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

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

        }

Filtre za iznimke možete registrirati na jedan od sljedeća tri načina:

  • Na razini akcije
  • Na razini kontrolera
  • Globalno

Sljedeći isječak koda pokazuje kako možete primijeniti filtar na razini akcije, tj. Na vašu metodu radnje kontrolera.

javna klasa EmployeesController: ApiController

{

    [NotImplementedExceptionFilter]

    javni zaposlenik GetEfficiee (int id)

    {

        baciti novi NotImplementedException ();

    }

}

Da biste primijenili filtar iznimke na razini kontrolera, morat ćete upotrijebiti atribut filtra na razini klase kao što je prikazano u nastavku.

[DatabaseExceptionFilter]

javna klasa EmployeesController: ApiController

{

    // Neki kod

}

Svoj prilagođeni filtar iznimki možete primijeniti i globalno tako da radi za sve kontrolere Web API-ja. Evo kako to možete učiniti.

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

Sljedeći isječak koda ilustrira kako možete primijeniti prilagođeni filtar iznimke koji smo ranije stvorili na vašu metodu kontrolera.

[CustomExceptionFilter]

 javni IEnumerable Get ()

 {

    baci novi DivideByZeroException (); 

 }

ASP.NET Web API podržava upotrebu HttpResponseException za rukovanje iznimkama na razini kontrolera i na razini akcije. Kada metoda radnje u web API-ju izbaci neuhvaćenu iznimku, iznimka se prevodi u HTTP statusni kod 500, tj., „Interna pogreška poslužitelja“. Ako koristite HttpResponseException, možete navesti statusni kod koji želite vratiti u konstruktoru klase HttpResponseException. Na taj način možete prilagoditi kodove pogrešaka kako bi ih učinili značajnijima.

Kako učiniti više u ASP.NET i ASP.NET Core:

  • Kako se koristi predmemoriranje u memoriji u ASP.NET Core
  • Kako postupati s pogreškama u ASP.NET web API-ju
  • Kako proslijediti više parametara metodama kontrolera Web API-ja
  • Kako prijaviti metapodatke zahtjeva i odgovora u ASP.NET Web API
  • Kako raditi s HttpModules-om u ASP.NET-u
  • Napredna verzija u ASP.NET Core Web API
  • Kako se koristi ubrizgavanje ovisnosti u ASP.NET Core
  • Kako raditi sa sesijama u ASP.NET-u
  • Kako raditi s HTTPHandlerima u ASP.NET-u
  • Kako koristiti IHostedService u ASP.NET Core
  • Kako potrošiti WCF SOAP uslugu u ASP.NET Core
  • Kako poboljšati izvedbu ASP.NET Core aplikacija
  • Kako konzumirati ASP.NET Core Web API pomoću RestSharp
  • Kako raditi s prijavom u ASP.NET Core
  • Kako koristiti MediatR u ASP.NET Core
  • Kako raditi sa stanjem sesije u ASP.NET Coreu
  • Kako koristiti Nancy u ASP.NET Coreu
  • Razumijevanje vezivanja parametara u ASP.NET Web API-ju
  • Kako prenijeti datoteke u ASP.NET Core MVC
  • Kako implementirati rukovanje globalnim iznimkama u ASP.NET Core Web API
  • Kako implementirati provjere zdravlja u ASP.NET Core
  • Najbolji primjeri u predmemoriranju u ASP.NET-u
  • Kako koristiti Apache Kafka razmjenu poruka u .NET-u
  • Kako omogućiti CORS na vašem web API-ju
  • Kada koristiti WebClient u odnosu na HttpClient u odnosu na HttpWebRequest
  • Kako raditi s predmemorijom Redis u .NET-u
  • Kada koristiti Task.WaitAll vs. Task.WhenAll u .NET