我们知道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