Как да се справим с грешки в ASP.NET Web API

Уеб API на ASP.NET на Microsoft е лека рамка, която можете да използвате за изграждане на RESTful услуги без гражданство, работещи на HTTP. Изключения са грешки, които се появяват по време на изпълнение, а обработката на изключения е техниката за обработка на грешките по време на изпълнение в кода на вашето приложение.

Всеки разработчик на ASP.NET Web API трябва да знае как да се справи с изключенията в Web API и как да изпраща подходящи кодове за грешки и съобщения за грешки от методите на контролера на Web API. Ще разгледаме как да изпълняваме тези задачи в секциите по-долу. 

Използване на HttpResponseException в ASP.NET Web API

Можете да използвате класа HttpResponseException, за да върнете специфични HTTP кодове за състояние и съобщения от вашите методи на контролер в уеб API. Ето един пример.

публичен служител GetEfficiee (int id)

{

    Служител emp = workerRepository.Get (id);

    ако (emp == null)

    {

        var response = new HttpResponseMessage (HttpStatusCode.NotFound)

        {

            Съдържание = нов StringContent („Служител не съществува“, System.Text.Encoding.UTF8, „text / plain“),

            StatusCode = HttpStatusCode.NotFound

        }

        хвърли нов HttpResponseException (отговор);

    }

    връщане emp;

}

Ако вашият уеб API връща IHttpActionResult, може да искате да напишете метода GetEfficiee, както е показано по-долу.

публичен IHttpActionResult GetEfficiee (int id)

{

    Служител emp = workerRepository.Get (id);

    ако (emp == null)

    {

        var response = new HttpResponseMessage (HttpStatusCode.NotFound)

        {

            Съдържание = нов StringContent („Служител не съществува“, System.Text.Encoding.UTF8, „text / plain“),

            StatusCode = HttpStatusCode.NotFound

        }

        хвърли нов HttpResponseException (отговор);

    }

    връщане Ok (emp);

}

Обърнете внимание, че кодът за грешка и съобщението за грешка се присвояват на обекта за отговор и че екземпляр на HttpResponseException се връща, когато възникне изключение в метода за действие на контролера на уеб API.

Използване на HttpError в ASP.NET Web API

Можете да използвате метода за разширение CreateErrorResponse в метода на вашия уеб API контролер, за да върнете значими кодове за грешки и съобщения за грешки. Имайте предвид, че методът CreateErrorResponse създава обект HttpError и след това го обвива в обект HttpResponseMessage.

Следният списък с кодове илюстрира как можете да използвате метода за разширение CreateErrorResponse от метода на действие на вашия контролер на уеб API.

публичен IActionResult GetEfficiee (int id)

{

    Служител emp = workerRepository.Get (id);

    ако (emp == null)

    {

       string message = "Служител не съществува";

        хвърли нов HttpResponseException (

            Request.CreateErrorResponse (HttpStatusCode.NotFound, съобщение));

    }

    връщане Ok (emp);

}

Обърнете се към метода GetEfficiee (), показан по-горе. Този метод приема идентификатор на служител като параметър и използва този идентификатор за търсене и извличане на запис на служител, като използва екземпляр на хранилището на служител. Ако запис на служител с посочения идентификатор на служител не бъде намерен, се изхвърля екземпляр на HttpResponseException. Обърнете внимание как се конструират подходящото съобщение за грешка и код за грешка, преди екземплярът на изключение да бъде изхвърлен от метода на контролера на Web API.

Използване на филтри за изключения в ASP.NET Web API

Филтрите за изключения са филтри, които могат да се използват за обработка на необработени изключения, генерирани в методите на вашия уеб API контролер. С други думи, можете да използвате филтри за изключения, за да уловите необработени изключения в уеб API, които произхождат от вашите методи на контролера. Обърнете внимание, че глобалният филтър за грешки е добър подход за обработка на изключения във вашия уеб API, ако необработените изключения се изхвърлят и не се обработват в методите на вашия контролер.

За да създадете филтър за изключения, трябва да внедрите интерфейса IExceptionFilter. Можете също да създадете филтри за изключения, като разширите абстрактния клас ExceptionFilterAttribute и след това замените метода OnException. Имайте предвид, че абстрактният клас ExceptionFilterAttribute на свой ред реализира интерфейса IExceptionFilter.

Следният кодов фрагмент илюстрира как можете да създадете персонализиран филтър за изключения, като разширите класа ExceptionFilterAttribute и след това замените метода OnException. Обърнете внимание как стандартните изключения, хвърлени от вашите методи на контролера, се улавят от персонализирания филтър за изключения и след това се преобразуват в HttpStatusResponse обекти със съответния HttpStatusCode.

публичен клас CustomExceptionFilter: ExceptionFilterAttribute

    {

        публично заместване void OnException (HttpActionExecutedContext actionExecutedContext)

        {

            HttpStatusCode статус = HttpStatusCode.InternalServerError;

            Съобщение на низ = String.Empty;

            var exceptionType = actionExecutedContext.Exception.GetType ();

            if (изключениеType == typeof (UnauthorizedAccessException))

            {

                message = "Достъпът до уеб API не е разрешен.";

                статус = HttpStatusCode.Неупълномощен;

            }

            else if (изключениеType == typeof (DivideByZeroException))

            {

                message = "Вътрешна грешка в сървъра.";

                статус = HttpStatusCode.InternalServerError;

            }

            друго

            {

                message = "Не е намерен.";

                статус = HttpStatusCode.NotFound;

            }

            actionExecutedContext.Response = нов HttpResponseMessage ()

            {

                Съдържание = нов StringContent (съобщение, System.Text.Encoding.UTF8, "text / plain"),

                StatusCode = състояние

            };

            base.OnException (actionExecutedContext);

        }

    }

Трябва да добавите персонализиран филтър за изключения към колекцията от филтри на обекта HttpConfiguration.

публичен статичен регистър за невалидни (HttpConfiguration config)

        {

            config.MapHttpAttributeRoutes ();

            config.Routes.MapHttpRoute (

                име: "DefaultApi",

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

                по подразбиране: нов {id = RouteParameter.O optional}

            );

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

            config.Filters.Add (нов CustomExceptionFilter ());

        }

Можете да регистрирате вашите филтри за изключения по един от следните три начина:

  • На ниво действие
  • На ниво контролер
  • В световен мащаб

Следният кодов фрагмент показва как можете да приложите филтър на ниво действие, т.е. към вашия метод на действие на контролера.

публичен клас EmployeesController: ApiController

{

    [NotImplementedExceptionFilter]

    публичен служител GetEfficiee (int id)

    {

        хвърли нов NotImplementedException ();

    }

}

За да приложите филтъра за изключения на ниво контролер, ще трябва да използвате атрибута на филтъра на ниво клас, както е показано по-долу.

[DatabaseExceptionFilter]

публичен клас EmployeesController: ApiController

{

    // Някакъв код

}

Можете също така да приложите вашия персонализиран филтър за изключения глобално, така че да работи за всички контролери на Web API. Ето как можете да направите това.

GlobalConfiguration.Configuration.Filters.Add (нов DatabaseExceptionFilterAttribute ());

Следният кодов фрагмент илюстрира как можете да приложите персонализирания филтър за изключения, който създадохме по-рано, към вашия метод на контролер.

[CustomExceptionFilter]

 публичен IEnumerable Get ()

 {

    хвърли нов DivideByZeroException (); 

 }

ASP.NET Web API поддържа използването на HttpResponseException за обработка на изключения както на ниво контролер, така и на ниво действие. Когато методът на действие в уеб API хвърля неприхванато изключение, изключението се превежда в HTTP код на състоянието 500, т.е. „Вътрешна грешка в сървъра“. Ако използвате HttpResponseException, можете да посочите кода на състоянието, който искате да върнете, в конструктора на класа HttpResponseException. По този начин можете да персонализирате кодовете си за грешки, за да ги направите по-значими.

Как да направите повече в ASP.NET и ASP.NET Core:

  • Как да използвам кеширането в паметта в ASP.NET Core
  • Как да се справим с грешки в ASP.NET Web API
  • Как да предавам множество параметри на методите на контролера на Web API
  • Как да регистрирам метаданни за заявки и отговори в ASP.NET Web API
  • Как да работя с HttpModules в ASP.NET
  • Разширено създаване на версии в ASP.NET Core Web API
  • Как да използвам инжектиране на зависимост в ASP.NET Core
  • Как да работите със сесии в ASP.NET
  • Как да работя с HTTPHandlers в ASP.NET
  • Как да използвам IHostedService в ASP.NET Core
  • Как да консумираме услуга WCF SOAP в ASP.NET Core
  • Как да подобрите производителността на приложенията на ASP.NET Core
  • Как да консумирате ASP.NET Core Web API с помощта на RestSharp
  • Как да работя с регистриране в ASP.NET Core
  • Как да използвам MediatR в ASP.NET Core
  • Как да работите със състоянието на сесията в ASP.NET Core
  • Как да използвам Nancy в ASP.NET Core
  • Разберете обвързването на параметри в ASP.NET Web API
  • Как да качвате файлове в ASP.NET Core MVC
  • Как да приложим обработка на глобални изключения в ASP.NET Core Web API
  • Как да приложим проверки на състоянието в ASP.NET Core
  • Най-добри практики за кеширане в ASP.NET
  • Как да използвам съобщенията на Apache Kafka в .NET
  • Как да активирате CORS на вашия уеб API
  • Кога да се използва WebClient срещу HttpClient срещу HttpWebRequest
  • Как да работите с Redis Cache в .NET
  • Кога да използвате Task.WaitAll срещу Task.WhenAll в .NET