前言
StatusCodePagesMiddleware中间件类似于ExceptionHandlerMiddleware中间件,在后续的请求处理过程中出现“错误”的情况下,使用一个错误处理程序来完成最终的请求处理和响应任务。两者的区别在于“错误”的定义。对于ExceptionHandlerMiddleware中间件,其所谓的错误是抛出异常,但是对于StatusCodePagesMiddleware中间件,400到599之间的响应状态代码被认为是错误。如下图代码片段所示,StatusCodePagesMiddleware中间件也采用了“标准”的定义模式,其配置options是通过对应的对象以Options模式的形式提供给它的。
公共类status depagesmidlware { public status depagesmidlware(request delegate next,iotoptionstatusdepagesopdations选项);公共任务调用(HttpContext上下文);}除了定义错误之外,StatusCodePagesMiddleware和ExceptionHandlerMiddleware对错误处理程序有不同的表达式。我们知道ExceptionHandlerMiddleware中间件使用的错误处理程序实际上是一个RequestDelegate类型的委托对象,但是错误处理程序是一个FuncStatusCodeContext类型的委托对象,Task to statusscodepagesmidleware中间件。如下面的代码片段所示,为StatusCodePagesMiddleware提供配置选项的StatusCodePagesOptions对象的唯一目的是提供此委托对象作为错误处理程序。
公共类StatusCodePagesOptions { public functionstatuscodecontext,Task HandleAsync { get设置;}}我们知道RequestDelegate对象相当于funcHttpContext和task类型的委托对象,StatusCodeContext对象实际上封装了一个HttpContext对象,所以StatusCodePagesMiddleware和ExceptionHandlerMiddleware中间件采用的错误处理程序本质上没有区别。如下面的代码片段所示,除了从StatusCodeContext对象中获取表示当前请求上下文的HttpContext对象之外,我们还可以通过其Next属性获取一个RequestDelegate对象,它表示由后续中间件组成的请求处理管道。至于其他属性Options,它显然会返回我们在创建StatusCodePagesMiddleware中间件时指定的StatusCodePagesOptions对象。
公共类statusscodecontext { public Http context Http context { get;} public request delegate Next { get;}公共状态显示选项{ get} public StatusCodeContext(HttpContext上下文,StatusCodePagesOptions选项,request delegate next);} 1.响应状态代码的错误处理
因为采用了响应状态码的错误处理策略,所以StatusCodePagesMiddleware中实现的所有错误处理操作都只会在当前响应状态码在400到599之间时发生,这反映在下面的代码片段中。从下面给出的代码片段中可以看出,StatusCodePagesMiddleware中间件在决定是否执行错误处理操作时,不仅会看当前的响应状态代码,还会看响应内容和媒体类型。如果已经包含响应内容或设置了媒体类型,中间件将不执行任何操作。
公共类status depagesmiddraware { private request delegate _ next;优先(priority的缩写)