【C#】.net core2.1,通过扩展状态代码页方法对404页面进行全局捕抓并响应信息

简介: 在开发一个网站项目时,除了异常过滤功能模块,还需要有针对404不存在的api接口和页面处理功能 本篇文章就来讲讲,如何自定义全局请求状态类来统一处理
作者:小5聊基础
简介:一只喜欢全栈方向的程序员,欢迎咨询,尽绵薄之力答疑解惑
编程原则:Write Less Do More

在上一篇文章中讲解了如何全局统一处理异常,可跳转查看<br/>
【C#】.net core2.1,自定义全局类对API接口和视图页面产生的异常统一处理

  • 流程图

image.png

【基本信息】

1)操作系统:windows11 <br/>
2)开发工具:VS 2017 <br/>
3)开发语言:C# <br/>
4)开发框架:.net core 2.1 <br/>
5)关键类:this IApplicationBuilder <br/>

【创建状态码页面扩展类】

技术日新月异,同一个功能,版本肯定会在不停更新升级,除非已经弃用,因此,需要针对版本进行使用,否则可能会因为版本不用导致报错<br/>
1)定义个静态类
自定义一个静态类即可,类命无需引用 <br/>
static UseStatusCodePagesExtension

2)设置类下面的一个自定义扩展方法 <br/>
public static void UseStatusCodePagesEx(this IApplicationBuilder app)<br/>
关键是this扩展方法参数,IApplicationBuilder app

3)this关键放在方法参数变量前面,表示对当前参数变量的一个扩展 <br/>
比如:MyTest(this string test) <br/>
那么就类型就可以通过点的方法调用扩展方法,"Hello".MyTest() <br/>

4)直接调用接口本身的方法,通过正则表达式的方式获取关键值 <br/>
app.UseStatusCodePages(context=>{ })

5)请求协议 <br/>
可以根据http和https进行请求协议判断,也许在项目上需要对这两个请求协议做一个区别判断
context.HttpContext.Request.IsHttps

6)请求地址 <br/>
string url = http + context.HttpContext.Request.Host + context.HttpContext.Request.Path;

image.png

7)类完整代码


using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
using System;
using System.Text;
using System.Threading.Tasks;

namespace web.Class
{
    /// <summary>
    /// 异常处理 - 不存在的请求(Get/Post)
    /// </summary>
    public static class UseStatusCodePagesExtension
    {
        /// <summary>
        /// 静态方法
        /// </summary>
        /// <param name="app">要进行扩展的类型</param>
        public static void UseStatusCodePagesEx(this IApplicationBuilder app)
        {
            app.UseStatusCodePages(context =>
            {
                /*
                    //添加带有指定处理程序的StatusCodePages中间件,该处理程序用于检查
                    //状态代码介于400和599之间且没有正文的响应。
                 */

                StringBuilder errorMessage = new StringBuilder();
                var method = context.HttpContext.Request.Method;
                if (string.IsNullOrEmpty(method))
                {
                    //return Task.CompletedTask;
                }

                string http = (context.HttpContext.Request.IsHttps ? "https://" : "http://");
                string url = http + context.HttpContext.Request.Host + context.HttpContext.Request.Path;
                int code = context.HttpContext.Response.StatusCode;

                if (method.ToLower() == "Get".ToLower())
                {
                    errorMessage.Clear();
                    errorMessage.Append($"<meta name=\"viewport\" content=\"width=device-width, height=device-height, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no\">");
                    errorMessage.Append($"<h1>访问的资源不存在</h1>");
                    errorMessage.Append($"<p>URL:{url}</p>");
                    errorMessage.Append($"<p>StatusCode:{code}</p>");
                    errorMessage.Append($"<p>GET</p>");

                    context.HttpContext.Response.ContentType = "text/html;charset=utf-8";
                    context.HttpContext.Response.StatusCode = 200;

                    using (var responseStream = context.HttpContext.Response.Body)
                    {
                        responseStream.Write(Encoding.Default.GetBytes(errorMessage.ToString()));
                    }
                }
                else if (method.ToLower() == "POST".ToLower())
                {
                    errorMessage.Clear();
                    errorMessage.Append($"访问的资源不存在,");
                    errorMessage.Append($"URL:{ url},");
                    errorMessage.Append($"StatusCode:{code},");
                    errorMessage.Append($"POST");

                    var result = new
                    {
                        message = errorMessage.ToString(),
                        code = 404
                    };

                    context.HttpContext.Response.ContentType = "application/json;charset=utf-8";
                    context.HttpContext.Response.StatusCode = 200;
                    using (var responseStream = context.HttpContext.Response.Body)
                    {
                        responseStream.Write(Encoding.Default.GetBytes(JsonConvert.SerializeObject(result)));
                    }
                }
                else
                {
                    errorMessage.Clear();
                    errorMessage.Append($"访问的资源不存在,");
                    errorMessage.Append($"URL:{ url},");
                    errorMessage.Append($"StatusCode:{code}");

                    var result = new {
                        message = errorMessage.ToString(),
                        code = 404
                    };

                    context.HttpContext.Response.ContentType = "application/json;charset=utf-8";
                    context.HttpContext.Response.StatusCode = 200;
                    using (var responseStream = context.HttpContext.Response.Body)
                    {
                        responseStream.Write(Encoding.Default.GetBytes(JsonConvert.SerializeObject(result)));
                    }
                }

                //输出错误日志到txt以及添加一条日志记录(使用了一次数据库链接)
                if (true)
                {
                }

                return Task.CompletedTask;
            });
        }
    }
}

【Startup启动类设置】

由于是对接口IApplicationBuilder进行扩展,所以只需要在Configure配置方法里进行调用即可
1)需要注意代码的顺序

//调用UseStatusCodePages中间件要在例如静态文件中间件和 MVC中间件等中间件前面调用
app.UseStatusCodePagesEx(); //自定义异常中间件

//开启静态文件访问 - wwwroot
相关文章
|
10天前
|
开发框架 前端开发 .NET
LIMS(实验室)信息管理系统源码、有哪些应用领域?采用C# ASP.NET dotnet 3.5 开发的一套实验室信息系统源码
集成于VS 2019,EXT.NET前端和ASP.NET后端,搭配MSSQL 2018数据库。系统覆盖样品管理、数据分析、报表和项目管理等实验室全流程。应用广泛,包括生产质检(如石化、制药)、环保监测、试验研究等领域。随着技术发展,现代LIMS还融合了临床、电子实验室笔记本和SaaS等功能,以满足复杂多样的实验室管理需求。
21 3
LIMS(实验室)信息管理系统源码、有哪些应用领域?采用C# ASP.NET dotnet 3.5 开发的一套实验室信息系统源码
|
3天前
|
C#
蓝易云 - C#将异步改成同步方法
注意:虽然这样可以将异步方法转为同步,但在实际开发中,我们通常推荐使用异步方法,因为它可以提高应用程序的响应性和并发性。将异步方法转为同步可能会导致死锁或性能问题。
7 2
|
3天前
|
前端开发 测试技术 C#
如何开发一套基于C#和.NET 6.0手术麻醉系统? 手术麻醉系统源码
如何开发一套基于C#和.NET 6.0手术麻醉系统?
12 1
|
4天前
|
开发框架 前端开发 调度
C#基于Quartz.NET实现任务调度并部署Windows服务
C#基于Quartz.NET实现任务调度并部署Windows服务
|
9天前
|
Java C# 数据安全/隐私保护
|
16天前
|
Cloud Native API C#
C#的现代化:.NET Core引领的技术革命
【6月更文挑战第9天】`.NET Core引领C#现代化,实现跨平台革命,提升性能并支持云原生应用。异步编程模型优化体验,统一API简化开发流程。C#应用场景扩展,开发效率提高,技术创新加速,预示其未来在技术领域将持续发挥关键作用。`
29 10
|
14天前
|
存储 编解码 算法
C#.NET逃逸时间算法生成分形图像的毕业设计完成!晒晒功能
该文介绍了一个使用C#.NET Visual Studio 2008开发的程序,包含错误修复的Julia、Mandelbrot和优化过的Newton三种算法,生成色彩丰富的分形图像。作者改进了原始算法的效率,将内层循环的画点操作移至外部,提升性能。程序提供五种图形模式,支持放大缩小及颜色更新,并允许用户自定义画布大小以调整精度。还具备保存为高质JPG的功能。附有四张示例图片展示生成的分形效果。
|
22天前
|
XML 开发框架 .NET
【.NET Core】常见C#代码约定
【.NET Core】常见C#代码约定
19 5
|
21天前
|
前端开发 Java C#
GitHub突破5k Star!这件事情我坚持了3年,努力打造C#/.NET/.NET Core全面的学习、工作、面试指南知识库
GitHub突破5k Star!这件事情我坚持了3年,努力打造C#/.NET/.NET Core全面的学习、工作、面试指南知识库
|
21天前
|
XML 开发框架 人工智能
C#/.NET/.NET Core拾遗补漏合集(24年5月更新)
C#/.NET/.NET Core拾遗补漏合集(24年5月更新)