使Asp.net Core同时支持输出Json/Xml
我们知道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的更多相关文章
- asp.net core 实现支持自定义 Content-Type
asp.net core 实现支持自定义 Content-Type Intro 我们最近有一个原本是内网的服务要上公网,在公网上有一层 Cloudflare 作为网站的公网流量提供者,CloudFla ...
- asp.net core 3.0 MVC JSON 全局配置
asp.net core 3.0 MVC JSON 全局配置 System.Text.Json(default) startup配置代码如下: using System.Text.Encodings. ...
- asp.net core 实现支持多语言
asp.net core 实现支持多语言 Intro 最近有一个外国友人通过邮件联系我,想用我的活动室预约,但是还没支持多语言,基本上都是写死的中文,所以最近想支持一下更多语言,于是有了多语言方面的一 ...
- Asp.Net Core 已支持 gRPC-Web !!
grpc-dotnet 项目在 PR #695 完成了 ASP.NET Core 服务与 .NET Core gRPC 客户端的 gRPC-Web 实现. 虽然目前还是实验性项目,但是并不阻碍我们为之 ...
- 解决asp.net core 日期格式 datetime Json返回 带T的问题
原文:解决asp.net core 日期格式 datetime Json返回 带T的问题 记录一下: Startup中,将 services.AddMvc(); 改为: services.AddMvc ...
- 使用jackson美化输出json/xml
转载:http://www.cnblogs.com/xiwang/ 如何使用jackson美化输出json/xml 1.美化POJO序列化xml 下面将POJO列化为xml并打印. Person pe ...
- 如何使用jackson美化输出json/xml
如何使用jackson美化输出json/xml 1.美化POJO序列化xml 下面将POJO列化为xml并打印. Person person = new Person(); //设置person属性 ...
- Asp.net Core WebApi 支持json/xml格式的数据返回
Asp.net core 在做webapi项目的时候,默认是只返回json格式的数据的,如果想要开启xml数据返回,需要在startup里配置如下: public void ConfigureServ ...
- 快速搭建CentOS+ASP.NET Core环境支持WebSocket
环境:CentOS 7.x,.net core 2 以下.net core 2安装操作为官方方法.如果你使用Docker,那么更简单了,只需要docker pull microsoft/dotnet就 ...
随机推荐
- 在linux下如何使用yum查看安装了哪些软件包
$yum list installed //列出所有已安装的软件包 yum针对软件包操作常用命令: 1.使用YUM查找软件包 命令:yum search 2.列出所有可安装的软件包 命令:yum li ...
- linux --> 进程和线程
进程和线程 进程(process)和线程(thread)是操作系统的基本概念,下面用一个类比,来解释它们. 1. 计算机的核心是CPU,它承担了所有的计算任务.它就像一座工厂,时刻在运行. 2. 假定 ...
- Comparable接口和Comparator接口
1.一个类在设计之初就要实现对该类对象的排序功能,那么这个类要实现Comparable接口,实现public int compareTo(T t)方法.如代码中的Student类.对于实现Compar ...
- NOIP知识点
基础算法 贪心 枚举 分治 二分 倍增 高精度 模拟 图论 图 最短路(dijkstra.spfa.floyd) 最小生成树(kruskal.prim) 并查集 拓扑排序 二分图染色 Tarjan 树 ...
- C#添加背景音乐
<MediaElement Name="audio"/> <Button Name="music" Content="点我有音乐哦& ...
- Alpha冲刺No.7
一.站立式会议 彻底完成初步的界面设计 实现界面的简单跳转 完成部分事件监听 移植摄像头.图库功能到真实手机环境测试 数据库上传获取日记 二.项目实际进展 完成了简单的界面设计 大致完成了跳转任务 数 ...
- edittext实现自动查询,刷新listview
mEdittextqueryvalue.addTextChangedListener(new TextWatcher() { @Override pub ...
- AWS中,如果使用了ELB,出现outofservice
平台:亚马逊AWS EC2 出现状况: 我创建了弹性平衡负载,也注册了实例,但是实例的状态一直是outofservice.为什么? 为什么会出现这个问题呢? 1:实例有问题: 2:负载平衡器创建的有问 ...
- CNN中的padding
在使用TF搭建CNN的过程中,卷积的操作如下 convolution = tf.nn.conv2d(X, filters, strides=[1,2,2,1], padding="SAME& ...
- nyoj 星期几?
星期几? 时间限制:500 ms | 内存限制:65535 KB 难度:2 描述 Acmer 小鱼儿 埋头ku算一道题 条件:已知给定 一日期 告诉你 ...