我们知道Asp.net Core是支持输出为Json格式的。同时也支持输出为xml格式。只要我们正确的配置。并在Request时指定正确的Accept,即可根据不同的Header来输出不同的格式.

前几天看Jessite4.0读其日志,又看到这段文字

所有连接加 .json 或 .xml 或增加 __ajax=json 参数,或增加 __ajax=xml 参数,则自动返回 json 或 xml 数据,而不返回视图

于是在想,我们能不能提供下Asp.net Core中这种功能。最笨的办法,当然是在每个API返回时,判断下有没有这个参数。话说回来,既然是每个请教都需要判断,那么,最简单的办法是不是使用Middleware

实现原理就是,对请求中是否有类似于_ajax参数进行判断,有之后,根据参数值选用不同的Accept.

实现


public class SerializationMiddleware
{ private readonly RequestDelegate _next; private readonly SerializationOption _option; public SerializationMiddleware(RequestDelegate next,SerializationOption option)
{
_next = next;
_option = option; } public async Task InvokeAsync(HttpContext context)
{
var servalue = context.Request.Query[_option.QueryName]; if (_option.SerializeJson && !string.IsNullOrEmpty(servalue))
{
if (servalue == "json")
{
context.Request.ContentType = "application/json";
context.Request.Headers["Accept"]= "application/json";
}
if (servalue == "xml")
{ context.Request.ContentType = "text/xml, application/xml";
context.Request.Headers["Accept"] = " application/xml,text/xml"; }
} await _next.Invoke(context);
}
} /// <summary>
/// 序列化选项
/// 是否序化Json/Xml
/// </summary>
public class SerializationOption
{
public string QueryName { get; set; } = "queryType";
public bool SerializeJson { get; set; } = false; public bool SerializeXml { get; set; } = false;
}

当我们完成SerializationMiddleware,我们可以将调用包装下


public static IMvcBuilder AddSerialization(this IMvcBuilder builder)
{ return builder.AddXmlSerializerFormatters(); } public static IApplicationBuilder UseSerialization(this IApplicationBuilder builder,SerializationOption option)
{ return builder.UseMiddleware<SerializationMiddleware>(option); }

我们在Startup.cs中使用


//先是在ConfigureServices(IServiceCollection services)
services.AddMvc(options =>
{
//options.RespectBrowserAcceptHeader = true; // false by default
options.OutputFormatters.Add(new XmlSerializerOutputFormatter());
})
.AddSerialization(); //在Configure(IApplicationBuilder app, IHostingEnvironment env) app.UseSerialization(new SerializationOption { SerializeJson = true, SerializeXml = true });

后续

我们当然可以将SerializationOption做成IOtion<>形式的,可以在其它地方查看其值。只是感觉上并没有多大的意义

使Asp.net Core同时支持输出Json/Xml的更多相关文章

  1. asp.net core 实现支持自定义 Content-Type

    asp.net core 实现支持自定义 Content-Type Intro 我们最近有一个原本是内网的服务要上公网,在公网上有一层 Cloudflare 作为网站的公网流量提供者,CloudFla ...

  2. asp.net core 3.0 MVC JSON 全局配置

    asp.net core 3.0 MVC JSON 全局配置 System.Text.Json(default) startup配置代码如下: using System.Text.Encodings. ...

  3. asp.net core 实现支持多语言

    asp.net core 实现支持多语言 Intro 最近有一个外国友人通过邮件联系我,想用我的活动室预约,但是还没支持多语言,基本上都是写死的中文,所以最近想支持一下更多语言,于是有了多语言方面的一 ...

  4. Asp.Net Core 已支持 gRPC-Web !!

    grpc-dotnet 项目在 PR #695 完成了 ASP.NET Core 服务与 .NET Core gRPC 客户端的 gRPC-Web 实现. 虽然目前还是实验性项目,但是并不阻碍我们为之 ...

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

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

  6. 使用jackson美化输出json/xml

    转载:http://www.cnblogs.com/xiwang/ 如何使用jackson美化输出json/xml 1.美化POJO序列化xml 下面将POJO列化为xml并打印. Person pe ...

  7. 如何使用jackson美化输出json/xml

    如何使用jackson美化输出json/xml 1.美化POJO序列化xml 下面将POJO列化为xml并打印. Person person = new Person(); //设置person属性 ...

  8. Asp.net Core WebApi 支持json/xml格式的数据返回

    Asp.net core 在做webapi项目的时候,默认是只返回json格式的数据的,如果想要开启xml数据返回,需要在startup里配置如下: public void ConfigureServ ...

  9. 快速搭建CentOS+ASP.NET Core环境支持WebSocket

    环境:CentOS 7.x,.net core 2 以下.net core 2安装操作为官方方法.如果你使用Docker,那么更简单了,只需要docker pull microsoft/dotnet就 ...

随机推荐

  1. [学习笔记]Javaweb开发视频教程之Tomcat9配置

    参考自北京动力节点的视频教程:https://www.bilibili.com/video/av14548279/?p=1 1.Java XE Java SE 是做电脑上运行的软件. Java EE ...

  2. 定位bug的姿势对吗?

    举个例子来说明 WEB页面上数据显示错误,本来应该显示38,  结果显示35,这个时候你怎么去定位这个问题出在哪里? 1.通过fiddler抓包工具(或者其他抓包工具), 分析接口返回的数据是35还是 ...

  3. 输入三个字符(可以重复)后,按各字符的ASCII码从小到大的顺序输出这三个字符。

    #include <stdio.h>#include <stdlib.h>int main(int argc, char *argv[]) { int a,b,i,j=0,t; ...

  4. git项目初始化

    Command line instructions 1.Git global setup git config --global user.name "99176942"git c ...

  5. Linux下的进程与线程(一)—— 进程概览

    进程是操作系统分配资源的基本单位.线程是操作系统进行运行和调度的基本单位. 进程之间可以切换,以便轮流占用CPU,实现并发.一般进程运行在用户模式下,只能执行指令集中的部分指令. 当进程进行上下文切换 ...

  6. SSDB安装配置 ERROR! autoconf required! install autoconf first

    SSDB简介 SSDB是一个C/C++语言开发的高性能开源NoSQL数据库服务器,支持Key-value, Keyhashmap, Key-zset(sorted set) 等数据结构,十分适合存储数 ...

  7. Hibernate学习笔记四 查询

    HQL语法 1.基本语法 String hql = " from com.yyb.domain.Customer ";//完整写法 String hql2 = " fro ...

  8. Windows下Apache的下载安装启动停止

    一:下载 打开任意浏览器,输入网址:http://httpd.apache.org/ 进入如下界面: 我们选择最新版Apache httpd 2.4.12Released,点击Download,进入如 ...

  9. 高级软件工程2017第6次作业——团队项目:Alpha阶段综合报告

    1.版本测试报告 1.1在测试过程中总共发现了多少Bug?每个类别的Bug分别为多少个? Bug分类 Bug内容 Fixed 编辑博文时改变文字格式会刷新界面 Can't reproduced 无 N ...

  10. 团队作业7——第二次项目冲刺(Beta版本12.06)

    项目每个成员的进展.存在问题.接下来两天的安排. 已完成的内容:队员每个人提出对接下来需要做的事情的看法和意见,将需要做的任务更新到了leangoo中进行管理,产品完成了界面优化的设计,测试复现了之前 ...