在ASP。网络核心7,最小的api提供一个轻量级的方法来创建web api减少样板代码。但是,仍然会出现错误,你应该能够优雅地处理它们。
本文讨论我们如何优雅地处理错误最少的API应用ASP。网络核心7。使用本文中提供的代码示例,您应该Visual Studio 2022安装在您的系统。如果你不已经有一个副本,你可以在这里下载Visual Studio 2022。
创建一个ASP。网络核心7minimal Web API project in Visual Studio 2022
首先,让我们创建一个ASP。网络核心7project in Visual Studio 2022. Follow these steps:
- 启动Visual Studio 2022 IDE。
- 点击“创建新项目。”
- 在“创建新项目”窗口中,选择“ASP。网络核心Web API” from the list of templates displayed.
- 单击Next。
- 在“配置您的新项目”窗口中,指定新项目的名称和位置。
- (可选)检查“解决方案和项目在同一个目录”复选框,根据您的喜好。
- 单击Next。
- 接下来,所示的“其他信息”窗口中选择“网络7.0(当前)”作为框架和取消选中该复选框,表示“使用控制器…”离开“验证类型”为“没有”(默认)。
- 确保复选框“启用OpenAPI支持”,“使码头工人”,“为HTTPS,配置”和“启用开放API支持”是不受我们不会使用这些特性。
- 单击Create。
我们将使用ASP。网络核心7Web API project to create a minimal API and implement error handling in the sections below.
在最小的API应用程序处理错误
替换默认生成的程序的源代码。cs文件在项目中我们用下面的代码片段创建。
var builder = WebApplication.CreateBuilder (args);应用var = builder.Build ();app.MapGet (“/”, () = >“Hello World !”);app.Map(“/错误”,()= >{抛出新的InvalidOperationException(“发生错误…”);});app.Run ();
当您运行应用程序时,“Hello World”文本消息将显示在您的web浏览器。如果你浏览到端点/错误,运行时错误发生,和应用程序的执行将停止,如图1所示。
图1所示。一个致命的异常在我们最小的API的应用程序。
有两个内置机制来处理错误最少的API应用程序,开发人员异常页面中间件和异常处理的中间件。我们检查每个反过来。
使用开发人员异常页面中间件
帮助开发人员在开发过程中诊断和修复错误,您可以使用中间件开发人员异常页面。中间件开发人员异常页面在浏览器中显示详细的错误信息出现在发生异常时。
这里是一个例子如何使用开发人员异常页面中间件在最小的API。
var builder = WebApplication.CreateBuilder (args);builder.Services.AddEndpointsApiExplorer ();/ / builder.Services.AddSwaggerGen ();应用var = builder.Build ();如果(app.Environment.IsDevelopment ()) {app.UseDeveloperExceptionPage ();}app.MapGet (“/”, () = >“Hello, world !”);app.Run ();
在这个例子中,UseDeveloperExceptionPage方法用于添加管道的中间件。启用了中间件只有当应用程序在开发环境中运行,这是由app.Environment.IsDevelopment()方法。
如果有异常发生在管道内,开发人员异常页面中间件抓住它并显示详细错误页面在浏览器中。错误页面包含异常信息,包括堆栈跟踪,请求细节,和环境变量,如图2所示。
图2。开发人员异常页面中间件在行动。
通过使用开发人员异常页面中间件,开发人员在开发过程中可以快速诊断和修复错误。
使用异常处理中间件
异常处理中间件抓了未处理的异常并返回一个错误响应。通常,您应该使用这个中间件在非开发性环境中。这里有一个例子如何使用异常处理中间件的最小的API。
var builder = WebApplication.CreateBuilder (args);应用var = builder.Build ();app.UseExceptionHandler (exceptionHandlerApp = > exceptionHandlerApp。运行(异步上下文= >等待Results.Problem () .ExecuteAsync(上下文)));app.Map(“/错误”,()= >{抛出新的InvalidOperationException(“发生错误…”);});app.MapGet (“/”, () = >“Hello, world !”);app.Run ();
在这个例子中,UseExceptionHandler方法用于配置该中间件。参数“/错误”指定的端点中间件将重定向的一个例外。
如果管道内出现未处理的异常,异常处理中间件捕获并将请求重定向到指定的端点。随后错误处理和返回一个适当的错误消息。
通过使用异常处理中间件,您可以很容易地处理异常发生在最小的api在ASP。网络核心7。这可以帮助提高你的API的可靠性和可用性。
使用ProblemDetails响应格式
ProblemDetails类是一种包括错误信息的细节,以避免创建自定义错误响应格式在ASP。净的核心。AddProblemDetails扩展方法属于IServiceCollection接口可以用来注册一个IProblemDetailsService的默认实现。
下面的中间件在ASP。网络核心generates ProblemDetails HTTP responses when you make a call to the AddProblemDetailsMiddleware method in your application.
- ExceptionHandlerMiddleware:这个中间件用于生成ProblemDetails反应如果没有自定义处理程序是可用的。
- DeveloperExceptionPageMiddleware: DeveloperExceptionPageMiddleware创建一个ProblemDetails响应如果接受HTTP头不包含text / html。
- StatusCodePagesMiddleware:默认情况下,StatusCodePagesMiddleware生成ProblemDetails反应。
下面的代码清单显示了如何使用ProblemDetails最小的api。
var builder = WebApplication.CreateBuilder (args);builder.Services.AddProblemDetails ();应用var = builder.Build ();app.UseExceptionHandler ();app.UseStatusCodePages ();app.Map(“/作者/ {id: int}”, (int id) < = > id = 0 ?Results.BadRequest():结果。好(新作者(id)));app.Map(“/错误”,()= >{抛出新的InvalidOperationException(“发生错误…”);});app.Run (); public record Author(int Id);
在这个例子中,/从HttpContext错误端点提取异常信息,并创建一个ProblemDetails对象与错误的细节。然后设置响应状态代码和内容类型,并返回ProblemDetails对象作为JSON响应。
使用身体状态代码页中间件来生成一个响应
当一个ASP。网络核心app encounters HTTP error codes such as “404 - Not Found,” it does not provide a status code page by default. Whenever a response body is not provided for an HTTP 400-599 error status code, the app returns the status code and an empty response body.
你可以调用UseStatusCodePages方法程序。cs文件应用程序启用文本处理程序的常见错误状态码。您可以使用StatusCodePagesMiddleware类在ASP。网络核心to generate the response as shown in the code snippet given below.
var builder = WebApplication.CreateBuilder (args);应用var = builder.Build ();app.UseStatusCodePages(异步statusCodeContext = >等待结果。问题(statusCode: statusCodeContext.HttpContext.Response.StatusCode) .ExecuteAsync (statusCodeContext.HttpContext));app.Map(“/作者/ {id: int}”, (int id) < = > id = 0 ?Results.BadRequest():结果。好(新作者(id)));app.Run ();公共记录作者(int Id);
在ASP。网络核心应用程序、异常过滤器可用于捕获特定类型的异常和优雅地处理它们。使用一个过滤器,实现IExceptionFilter接口,并将其添加到应用程序的管道。您可以了解更多关于使用异常过滤器(和其他过滤器)在ASP。净的核心我以前在这里的文章。