千家信息网

.NetCore Web Api怎么用ActionFilterAttribute统一接口返回值格式

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,本文小编为大家详细介绍".NetCore Web Api怎么用ActionFilterAttribute统一接口返回值格式",内容详细,步骤清晰,细节处理妥当,希望这篇".NetCore Web Ap
千家信息网最后更新 2026年11月02日.NetCore Web Api怎么用ActionFilterAttribute统一接口返回值格式

本文小编为大家详细介绍".NetCore Web Api怎么用ActionFilterAttribute统一接口返回值格式",内容详细,步骤清晰,细节处理妥当,希望这篇".NetCore Web Api怎么用ActionFilterAttribute统一接口返回值格式"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

.Net Core 同 Asp.Net MVC一样有几种过滤器,这里不再赘述每个过滤器的执行顺序与作用。

在实际项目开发过程中,统一API返回值格式对前端或第三方调用将是非常必要的,在.NetCore中我们可以通过ActionFilterAttribute来进行统一返回值的封装。

在封装之前我们需要考虑下面几个问题:

1,需要对哪些结果进行封装

我目前的做法是,只对ObjectResult进行封装,其他的类型:FileResult,ContentResult,EmptyResult,RedirectResult不予处理

2,对异常错误的封装

既然是统一返回值,当然也要考虑接口异常的问题了

但是不是所有的异常我们都需要返回给前端的,我们可能需要自定义一个业务异常,业务异常可以在前端进行友好提示,系统异常完全没必要抛出给前端或第三方,且需要对系统异常进行日志记录

项目结构:

Exceptions:自定义业务异常

Filters:自定义过滤器(统一结果封装,全局异常)

Models:统一结果实体

部分代码:

using System; namespace NetCoreCommonResult.Exceptions{    ///     /// 自定义业务异常,可以由前端抛出友好的提示    ///     public class BizException:Exception    {        public BizException()        {        }        public BizException(string message):base(message)        public BizException(string message, Exception ex) : base(message, ex)    }}
using Microsoft.AspNetCore.Mvc;using Microsoft.AspNetCore.Mvc.Filters; namespace NetCoreCommonResult.Filters{    public class CommonResultFilterAttribute : ActionFilterAttribute    {        public override void OnResultExecuting(ResultExecutingContext context)        {            if (context.Result is ObjectResult objRst)            {                if (objRst.Value is Models.ApiResult)                    return;                context.Result = new ObjectResult(new Models.ApiResult                {                    Success = true,                    Message = string.Empty,                    Data = objRst.Value                });            }        }    }}
using Microsoft.AspNetCore.Mvc;using Microsoft.AspNetCore.Mvc.Filters;using Microsoft.Extensions.Logging; namespace NetCoreCommonResult.Filters{    public class GlobalExceptionFilterAttribute : ExceptionFilterAttribute    {        private readonly ILogger _logger;        public GlobalExceptionFilterAttribute(ILogger logger)        {            _logger = logger;        }        public override void OnException(ExceptionContext context)        {            context.ExceptionHandled = true;            var isBizExp = context.Exception is Exceptions.BizException;            context.Result = new ObjectResult(new Models.ApiResult            {                Success = false,                Message = context.Exception.Message            });            //非业务异常记录errorLog,返回500状态码,前端通过捕获500状态码进行友好提示            if (isBizExp == false)            {                _logger.LogError(context.Exception, context.Exception.Message);                context.HttpContext.Response.StatusCode = 500;            }            base.OnException(context);        }    }}

Startup.cs

using Microsoft.AspNetCore.Builder;using Microsoft.AspNetCore.Hosting;using Microsoft.Extensions.Configuration;using Microsoft.Extensions.DependencyInjection;using Microsoft.Extensions.Hosting; namespace NetCoreCommonResult{    public class Startup    {        public Startup(IConfiguration configuration)        {            Configuration = configuration;        }        public IConfiguration Configuration { get; }        // This method gets called by the runtime. Use this method to add services to the container.        public void ConfigureServices(IServiceCollection services)            services.AddLogging();            services.AddControllers(ops =>            {                //添加过滤器                ops.Filters.Add(new Filters.CommonResultFilterAttribute());                //GlobalExceptionFilterAttribute构造中注入其他服务,需要通过ServiceFilter添加                ops.Filters.Add(new Microsoft.AspNetCore.Mvc.ServiceFilterAttribute(typeof(Filters.GlobalExceptionFilterAttribute)));            });            //注册GlobalExceptionFilterAttribute            services.AddScoped();        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)            if (env.IsDevelopment())                app.UseDeveloperExceptionPage();            }            else                app.UseExceptionHandler("/Error");            app.UseStaticFiles();            app.UseRouting();            app.UseAuthorization();            app.UseEndpoints(endpoints =>                endpoints.MapControllers();    }}

最后新建一个Controller然后写上几个不同返回值的的Action

using Microsoft.AspNetCore.Mvc;using System;using System.Collections.Generic;using System.Text;using System.Threading.Tasks; namespace NetCoreCommonResult.Controllers{    [Route("api/[controller]")]    [ApiController]    public class HomeController : ControllerBase    {        ///         /// string        ///         ///         [HttpGet]        public string Index() => "Welecome to .NetCore";        /// 跳转,不处理        [HttpGet("redirect")]        public ActionResult Redirect() => RedirectToAction("Index");        ///        [HttpGet("num")]        public int Num() => 10;        /// 异步        [HttpGet("async")]        public Task> TaskString() =>Task.FromResult>(new[] { "A","B","C"});        /// 文件输出,不处理        [HttpGet("file")]        public ActionResult GetFile() => File(Encoding.UTF8.GetBytes("File String"), "text/plain");        /// 空返回值,不处理        [HttpGet("empty")]        public ActionResult Empty() => Empty();        /// contentResult 不处理        [HttpGet("content")]        public ActionResult Content() => Content("this is content");        /// 异常,返回500错误        [HttpGet("exception")]        public ActionResult GetException() => throw new InvalidOperationException("invalid");        /// 自定义异常,返回200        [HttpGet("bizException")]        public ActionResult GetBizException() => throw new Exceptions.BizException("bizException");    }}

下面是返回结果截图:

上图:访问/api/home和/api/home/redirect的结果

上图:Action返回数字的结果

上图:返回string集合的结果

上图:输出文本文件的结果

上图:返回ContentResult的结果

上图:系统异常的结果,输出状态码为500

上图:抛出业务异常的结果,输出状态码200

读到这里,这篇".NetCore Web Api怎么用ActionFilterAttribute统一接口返回值格式"文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注行业资讯频道。

结果 统一 上图 前端 处理 封装 业务 接口 格式 状态 过滤器 输出 文章 系统 提示 必要 内容 文件 第三方 错误 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网与科技 科技制造互联网公司 互联网科技公司怎么样 互联网与未来科技 善班互联网科技有限公司 唐信互联网科技 大连 重庆科技学院互联网 科技伦理 互联网公司 无锡溥仪互联网科技有限公司 成都仁贤领冠互联网科技有限公司 互联网系的金融科技公司 成都互联网科技公司工作好不好 互联网科技人工智能实验室 工业互联网展湾科技股份有限公司 无锡工业互联网科技有限公司 厦门江牛科技互联网 互联网公司属于科技吗 福仕德教育科技互联网 玉溪新华互联网科技怎么选 东风日产互联网科技公司叫什么 科技金融是不是互联网金融 互联网下的科技发展 善班互联网科技 亿人帮互联网科技 汉立互联网科技有限公司联系电话 互联网对科技的发展 港股科技和互联网 杭州壁岐互联网科技有限公司 群盈汇互联网科技有限公司 互联网高科技行业有哪些企业
0