Asp.Net Web API exception handling experience summary
In the previous tutorial, I introduced to you the development and use of Filter in Web API. When talking about ExceptionFilter, there was a pitfall: ExceptionFilter can only intercept and process events that occur during Action execution. Exception, if an exception occurs outside of the Action execution process, ExceptionFilter is powerless.
These exceptions include:
1. Exceptions that occur in the Controller construction method
2. Exceptions that occur in MessageHandlers
3. Exceptions that occur during the routing process Exceptions
4. Exceptions that occur during the serialization/deserialization process of Body
It can be seen that ExceptionFilter can only solve the exceptions that occur after the ApiControler is successfully instantiated and during the execution of Action. Exceptions; in order to solve this problem, in addition to ExceptionFilter, two extension points for exception recording and processing are introduced in the WEB API:
IExceptionLogger and IExceptionHandler.
and these two extensions are registered and managed as a pipeline component for the web API, and they have different division of labor:
iexceptionLogger as an abnormal log record component. Recording runs through the entire Web API life cycle. In the Web API framework, any uncaught/handled exception in any request cycle will first enter the exception logging pipeline for exception Log recording. In the Web API Multiple IExceptionLogger instances can be registered to be responsible for different exception handling.
IExceptionHandler, as an exception handling component, is responsible for the processing after the exception occurs. It is at the end of the exception processing pipeline. When the IExceptionLogger component completes a recording and there is no relevant ExceptoinFilter to handle the exception, it will finally Call ExceptionHandler for exception handling. In Web API, there is only one ExceptionHandler for exception handling.
In the Web API framework, two base classes are given: ExceptionLogger and ExceptionHandler. When using the ExceptionLogger base class, it provides the ShouldLog virtual method. This method is called in the base class and its function is to avoid The same exception is repeatedly recorded by the same ExceptionLogger instance (for example, when the exception is thrown again in the subsequent pipeline, or the same ExceptionLogger object is accidentally registered twice, there is a possibility of repeated recording). We can also override the ShouldLog method. Add our own exception record judgment logic to make different ExceptionLogger calls for different scenarios. If you are interested, you can decompile the ExceptionLogger base class and take a look. It uses the display interface implementation, which is a very interesting technique. Let's look at an example of using ExceptionLogger:
public class ErroLogger : ExceptionLogger { public async Task LogAsync(ExceptionLoggerContext context, CancellationToken cancellationToken) { var sb = new StringBuilder(); //获取Log组件 ILogger log = LogManager.GetCurrentClassLogger(); var request = context.Request; sb.AppendLine("URL:"); //获取URL var url = request.RequestUri.ToString(); sb.AppendLine(url); log.Error(context.Exception,sb.ToString(),""); } public override bool ShouldLog(ExceptionLoggerContext context) { return context.Exception is DemoException && base.ShouldLog(context); } }
In this example, we rewrite ShouldLog to ensure that this ExceptionLogger only records exceptions of the type DemoException, and The base class method is also called to ensure that the same exception will not be recorded repeatedly. In the LogAsync method, I recorded the request URL that caused the exception through the Log component, and also recorded the exception information.
Next we need to register this component:
Write
config.Services.Add(typeof(IExceptionLogger),new ErroLogger());
public class ErrorHandler : ExceptionHandler { public override async Task HandleAsync(ExceptionHandlerContext context, CancellationToken cancellationToken) { if (context.Exception is DemoException) { context.Result = new ResponseMessageResult(context.Request.CreateResponse(HttpStatusCode.BadRequest,new {Message=context.Exception.Message})); } else { context.Result = new ResponseMessageResult(context.Request.CreateResponse(HttpStatusCode.InternalServerError,new {Message = "服务器已被外星人绑架"})); } } }
config.Services.Replace(typeof(IExceptionHandler),new ErrorHandler());
At this point, the simple development of the ExceptionLogger component and ExceptionHandler component is completed. During the development process, we can see that ExceptionLogger is responsible for global exception recording. ExceptionLogger will capture and record any unhandled exceptions that occur under the Web API framework pipeline. The functions of ExceptionHandler and ExceptionFilter overlap, so when to use ExceptionHandler and when to use ExceptionFilter? We can list the differences between the two in the following table:
|
ExceptionFilter |
ExceptionHandler |
##Scope |
Controller、Action |
##Global
|
Number of instances
|
Unlimited
|
Globally unique
|
After successful instantiation | Web APILoaded successfully After |
The above is the detailed content of Asp.Net Web API exception handling experience summary. For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics

The usage methods of symbols in C language cover arithmetic, assignment, conditions, logic, bit operators, etc. Arithmetic operators are used for basic mathematical operations, assignment operators are used for assignment and addition, subtraction, multiplication and division assignment, condition operators are used for different operations according to conditions, logical operators are used for logical operations, bit operators are used for bit-level operations, and special constants are used to represent null pointers, end-of-file markers, and non-numeric values.

In C, the char type is used in strings: 1. Store a single character; 2. Use an array to represent a string and end with a null terminator; 3. Operate through a string operation function; 4. Read or output a string from the keyboard.

In C language, special characters are processed through escape sequences, such as: \n represents line breaks. \t means tab character. Use escape sequences or character constants to represent special characters, such as char c = '\n'. Note that the backslash needs to be escaped twice. Different platforms and compilers may have different escape sequences, please consult the documentation.

The difference between multithreading and asynchronous is that multithreading executes multiple threads at the same time, while asynchronously performs operations without blocking the current thread. Multithreading is used for compute-intensive tasks, while asynchronously is used for user interaction. The advantage of multi-threading is to improve computing performance, while the advantage of asynchronous is to not block UI threads. Choosing multithreading or asynchronous depends on the nature of the task: Computation-intensive tasks use multithreading, tasks that interact with external resources and need to keep UI responsiveness use asynchronous.

In C language, the main difference between char and wchar_t is character encoding: char uses ASCII or extends ASCII, wchar_t uses Unicode; char takes up 1-2 bytes, wchar_t takes up 2-4 bytes; char is suitable for English text, wchar_t is suitable for multilingual text; char is widely supported, wchar_t depends on whether the compiler and operating system support Unicode; char is limited in character range, wchar_t has a larger character range, and special functions are used for arithmetic operations.

In C language, char type conversion can be directly converted to another type by: casting: using casting characters. Automatic type conversion: When one type of data can accommodate another type of value, the compiler automatically converts it.

char and unsigned char are two data types that store character data. The main difference is the way to deal with negative and positive numbers: value range: char signed (-128 to 127), and unsigned char unsigned (0 to 255). Negative number processing: char can store negative numbers, unsigned char cannot. Bit mode: char The highest bit represents the symbol, unsigned char Unsigned bit. Arithmetic operations: char and unsigned char are signed and unsigned types, and their arithmetic operations are different. Compatibility: char and unsigned char

Errors and avoidance methods for using char in C language: Uninitialized char variables: Initialize using constants or string literals. Out of character range: Compare whether the variable value is within the valid range (-128 to 127). Character comparison is case-insensitive: Use toupper() or tolower() to convert character case. '\0' is not added when referencing a character array with char*: use strlen() or manually add '\0' to mark the end of the array. Ignore the array size when using char arrays: explicitly specify the array size or use sizeof() to determine the length. No null pointer is not checked when using char pointer: Check whether the pointer is NULL before use. Use char pointer to point to non-character data
