作者:小5聊基础
简介:一只喜欢全栈方向的程序员,欢迎咨询,尽绵薄之力答疑解惑
编程原则:Write Less Do More
在上一篇文章中讲解了如何全局统一处理异常,可跳转查看<br/>
【C#】.net core2.1,自定义全局类对API接口和视图页面产生的异常统一处理
- 流程图
【基本信息】
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;
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