使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<>形式的,可以在其它地方查看其值。只是感觉上并没有多大的意义

原文地址:https://www.cnblogs.com/startewho/p/8856497.html

时间: 2024-10-10 23:32:32

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

如何利用Serilog的RequestLogging来精简ASP.NET Core的日志输出

这是该系列的第一篇文章:在ASP.NET Core 3.0中使用Serilog.AspNetCore. 第1部分-使用Serilog RequestLogging来简化ASP.NET Core的日志输出(本篇文章) 第2部分-使用Serilog记录所选的端点名称[敬请期待] 第3部分-使用Serilog.AspNetCore记录MVC属性[敬请期待] 作者:依乐祝 译文地址:https://www.cnblogs.com/yilezhu/p/12215934.html 原文地址:https://

asp.net core 实现支持多语言

asp.net core 实现支持多语言 Intro 最近有一个外国友人通过邮件联系我,想用我的活动室预约,但是还没支持多语言,基本上都是写死的中文,所以最近想支持一下更多语言,于是有了多语言方面的一些实践 国际化/本地化介绍 国际化(Globalization)和本地化(Localization)是要实现的多语言支持的基础 Globalization is the process of designing and developing applications that function fo

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

以前用python,go尝试在linux下做web服务,python没有强类型支持与高性能,go又没有很好的集成开发环境(还有强迫症的语法),回头看了几次.net,都没有时间尝试,现终于实现了这些想法,与大家分享.做web大项目,做工程,必须要有称手的工具帮我调试.测试.开发.工程化很重要,VS是一个称职好选手. 环境:CentOS 7.x,.net core 2 以下.net core 2安装操作为官方方法.如果你使用Docker,那么更简单了,只需要docker pull microsoft

在Asp.Net Core中关于appsettings.json的快速简便的读取和设置方式

在Asp.Net Core 中,配置信息已从原来Asp.Net的XML格式改为了更为流行的JSON格式,配置文件也由原来的App.config改成了appsettings.json. 那么对于这个appsettings.json中的配置信息的读取,使用最多的是使用与配置对应的实体模型,调用services.Configure<TOptions>()泛型方法载入配置. 这种方式的好处在于,将配置数据载入到对应的实体中后,项目的其它地方都可以使用,常见的是用于Controller中. 其缺点是不快

Handle Refresh Token Using ASP.NET Core 2.0 And JSON Web Token

来源:   https://www.c-sharpcorner.com/article/handle-refresh-token-using-asp-net-core-2-0-and-json-web-token/ In this article , you will learn how to deal with the refresh token when you use jwt (JSON Web Token) as your access_token. Backgroud Many peo

Asp.Net Core中使用Newtonsoft.Json进行序列化处理解决返回值首字母小写

一.Newtonsoft.Json仅 依赖.Net Standard所以支持.Net Framework也支持.Net Core 二.使用实例 Jquery 的ajax get请求 $('#btnOne').click(function () { //使用ajax get请求json 数据 $.get('@Url.Action("DataOne")', {}, function (data) { console.info(data); console.info(data[0].menu

使用ASP.NET Core支持GraphQL -- 较为原始的方法

GraphQL简介 下面是GraphQL的定义: GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时. GraphQL 对你的 API 中的数据提供了一套易于理解的完整描述,使得客户端能够准确地获得它需要的数据,而且没有任何冗余,也让 API 更容易地随着时间推移而演进,还能用于构建强大的开发者工具. GraphQL由Facebook开发,始于2012年,2015年公开. GraphQL牛逼之处是它可以让客户端精确的查询它们想要的,不附加额外的东西,这样的话就很容易让

ASP.NET Core appsettings.json 文件

ASP.NET Core appsettings.json 文件 在本节中,我们将讨论 ASP.NET Core 项目中appsettings.json文件的重要性. 在以前的 ASP.NET 版本中,我们将应用程序配置设置(例如数据库连接字符串)存储在web.config文件中. 在 Asp.Net Core 中, 应用程序配置设置可以来自以下不同的配置源. 文件(appsettings.json, appsettings..json) Environment环境不同,托管在对应环境. Use

10.ASP.NET Core launchSettings.json file

这篇文章,我将带领大家学习ASP.NET Core中的launchSettings.json文件.为了学习它,我们打开之前建的空白模板的ASP.NET Core项目. 从上面的图片中你可以看到,我们项目的属性中有一个launchSettings.json文件.那么我们来一起学习这个重要的文件吧. launchSettings.json文件 当我们使用Visual Studio或者.NET Core CLI运行项目的时候,就会使用到LaunchSettings.json文件中的这些设置. 你需要特