使Asp.net Core同时支持输出Json/Xml

Posted HelyCheng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使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 项目实战(第十二章)添加对SqlServerMySqlOracle的支持

ASP.NET Core Web 应用程序系列- 在ASP.NET Core中使用Autofac替换自带DI进行构造函数和属性的批量依赖注入(MVC当中应用)

ASP.NET Core Web 应用程序系列- 在ASP.NET Core中使用Autofac替换自带DI进行构造函数和属性的批量依赖注入(MVC当中应用)

Asp.Net Core 中的静态文件

Asp.Net Core 中的静态文件

.NET Core 3.0及ASP.NET Core 3.0 前瞻