这篇文章介绍的是一个黑魔法。

我们知道,在我们项目开发中,对Response需要定制化的数据结构,比如需要一个字段 Status 用来表示响应的状态码;字段Message 用来表示请求的消息,字段Data表示数据。 简单的讲,就是所有的响应都按照我们想要的数据结构来,统一的响应有助于我们项目的顺利进展,因为这涉及前后端工程师的配合,代码的统一又给了工程师简单、直接的编程思想。

比如,我们的Action可能会这样写:

高亮部分是我们真正的业务代码,像这样的Action会很多,几乎所有Action都要实例化一个类似HttpMessage的对象,然后赋值返回给client。

有没有一劳永逸、并且很优雅的办法呢?

答案是:有!

这便是今天我要讲的如何使用Formatter来实现我们的需求。 简单的讲,就是继承 TextOutputFormatter 类,并重写其WriteResponseBodyAsync方法,重写成我们的逻辑。

代码比较简单,相信各位都能看懂,就不做解释了。

怎么用呢?

首先在Startup类的ConfigureServices方法添加我们写好的Formatter,并指定这个Formatter只作用在"application/json"类型的响应输出上。 这样,在标记了[Produces("application/json")] Filter的Controller或Action里都可以得到我们自定义的数据结构了:

注意:看我们的Action的返回值,不是HttpMessage,而是我们的业务数据,并且整个Action内没有写任何关于自定义Response数据结构的代码,只是巧妙的利用了Response.StatusCode。 唯一缺憾就是不能写Server返回的消息字符串,比如上面提到的Message字段。不过这个可以和前端约定好Code的含义,在Client输出友好的提示信息。这样还有一个好处是可以方便的做本地化。

最后,我们在浏览器得到的响应就是这样的:

{"status":200,info:[{},{},{}]}

我们做框架有一个很重要目的,就是让程序员少些与业务不相干的代码。

同时,留下了一个焖题:在添加我们自定义的Formatter的同时怎么使用原生的结构呢?

以后再讲!

.NET 黑魔法 - asp.net core 自定义格式的响应的更多相关文章

  1. asp.net core 自定义认证方式--请求头认证

    asp.net core 自定义认证方式--请求头认证 Intro 最近开始真正的实践了一些网关的东西,最近写几篇文章分享一下我的实践以及遇到的问题. 本文主要介绍网关后面的服务如何进行认证. 解决思 ...

  2. asp.net core自定义端口

    asp.net Core 自定义端口 官方文档 aspnet内库源码: https://github.com/aspnet dotnet系统内库源码:https://github.com/dotnet ...

  3. 解决asp.net core 日期格式 datetime Json返回 带T的问题

    原文:解决asp.net core 日期格式 datetime Json返回 带T的问题 记录一下: Startup中,将 services.AddMvc(); 改为: services.AddMvc ...

  4. 如何在ASP.NET Core自定义中间件中读取Request.Body和Response.Body的内容?

    原文:如何在ASP.NET Core自定义中间件中读取Request.Body和Response.Body的内容? 文章名称: 如何在ASP.NET Core自定义中间件读取Request.Body和 ...

  5. asp.net core 自定义异常处理中间件

    asp.net core 自定义异常处理中间件 Intro 在 asp.net core 中全局异常处理,有时候可能不能满足我们的需要,可能就需要自己自定义一个中间件处理了,最近遇到一个问题,有一些异 ...

  6. asp.net core 自定义 Policy 替换 AllowAnonymous 的行为

    asp.net core 自定义 Policy 替换 AllowAnonymous 的行为 Intro 最近对我们的服务进行了改造,原本内部服务在内部可以匿名调用,现在增加了限制,通过 identit ...

  7. asp.net core 自定义基于 HttpContext 的 Serilog Enricher

    asp.net core 自定义基于 HttpContext 的 Serilog Enricher Intro 通过 HttpContext 我们可以拿到很多有用的信息,比如 Path/QuerySt ...

  8. ASP.NET Core 如何记录每次响应的Response信息 - sky 胡萝卜星星 - CSDN博客

    原文:ASP.NET Core 如何记录每次响应的Response信息 - sky 胡萝卜星星 - CSDN博客 上一篇文章中我们已经成功的记录了Request部分的信息,现在我们来看下如何记录Res ...

  9. asp.net core 自定义401和异常显示内容(JWT认证、Cookie Base认证失败显示内容)

    asp.net core 2.0使用JWT认证园子里已经有挺多帖子了,但开发中发现认证未授权情况下返回的401状态码是没有任何信息的,业务中可能有需要返回一串错误的Json信息.在这里我分享一个自定义 ...

随机推荐

  1. HTTP缓存机制及原理

    前言 Http 缓存机制作为 web 性能优化的重要手段,对于从事 Web 开发的同学们来说,应该是知识体系库中的一个基础环节,同时对于有志成为前端架构师的同学来说是必备的知识技能.但是对于很多前端同 ...

  2. 在SVNX中实现$Ids的自动替换

    在PHPstorm中实现$Ids的自动替换 ①.打开SVN的配置文件. [miscellany] enable-auto-props = yes [auto-props] .c = svn:keywo ...

  3. [archlinux][plasma][screensaver] plasma5配置屏保程序,没成功(-_-#)

    plamsa用了好久,一直没有屏保.我想要玄酷的屏保! 用xscreensaver, 之前用FVWM2的时候,就用过了,很玄酷. 一,安装 pacman -S xscreensaver 二,配置 xs ...

  4. [skill] ctags支持函数声明

    一般情况下,使用ctags的时候,默认使用如下命令: ctags -R ./ 但是这种情况下,如果运行在include文件夹下的时候,好多函数是跳转不过去的,因为这种默认情况下,函数声明并不会被索引. ...

  5. c++中new的三种用法详细解析

    转载至: http://www.jb51.net/article/41524.htm 以下的是对c++中new的三种使用方法进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助. 一. ...

  6. todo: 改变字体的动画

    todo: 截取指定区域的图片, 改变字体的动画

  7. springboot 整合swagger-ui

    一.添加maven依赖 <dependency> <groupId>io.springfox</groupId> <artifactId>springf ...

  8. java之map的基本介绍

    map简介 在讲解Map排序之前,我们先来稍微了解下map.map是键值对的集合接口,它的实现类主要包括:HashMap,TreeMap,Hashtable以及LinkedHashMap等.其中这四者 ...

  9. module_init 内核调用过程

    内核版本:linux_2.6.22.6 入口源文件: init.h

  10. redis缓存和mysql数据库同步

    附redis关于缓存雪崩和缓存穿透,热点key 穿透 穿透:频繁查询一个不存在的数据,由于缓存不命中,每次都要查询持久层.从而失去缓存的意义. 解决办法: 持久层查询不到就缓存空结果,查询时先判断缓存 ...