c# – 每个请求的ASP.NET Core API JSON serializersettings

前端之家收集整理的这篇文章主要介绍了c# – 每个请求的ASP.NET Core API JSON serializersettings前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
根据请求中的某些值(标题或URL),我想更改DTO对象的序列化.
为什么?好吧,我已将[JsonProperty(“A”)]应用于我的DTO,但根据客户端(网站或移动应用程序),它是否要使用该属性.
我开始了
services
.AddMvc()
.AddJsonOptions(opt =>
{
#if DEBUG
    opt.SerializerSettings.ContractResolver = new NoJsonPropertyNameContractResolver();
#endif
}

因此,在调试时,我获得了具有完整属性名称的JSON.我使用JsonProperty属性来缩短响应JSON,这适用于移动应用程序(Xamarin),后者反序列化回到相同的DTO.
但现在我有一个网站使用相同的API通过jQuery获取数据,但在那里我想要处理DTO的完整属性名称,而不是JsonProperty属性中给出的名称.
网站和WebApi位于同一台服务器上,因此如果响应更大,则没有问题.

我开始使用中间件类来对客户标头值做出反应,这有效,但现在我不知道如何进入JSON SerializerSettings.搜索网络但找不到它.

搜索时我读过有关InputFormatters和OutputFormatters,以及内容协商,但我不知道我必须去哪个方向.

我不想使用不同的设置两次部署相同的API.
如果这会有所帮助,我能够改变routesconfig之类的东西.

更新
不仅JSON响应必须以两种不同的方式序列化,而且反序列化必须以两种不同的方式完成.

解决方法

这有两个选择:

1.手动格式化

您通过services.AddMvc()设置的选项.AddJsonOptions()在DI中注册,您可以将其注入您的控制器和服务:

public HomeController(IOptions<MvcJsonOptions> optionsAccessor)
{
    JsonSerializerSettings jsonSettings = optionsAccessor.Value.SerializerSettings;
}

要按请求覆盖这些序列化设置,您可以使用Json方法或创建JsonResult实例:

public IActionResult Get()
{
    return Json(data,new JsonSerializerSettings());

    return new JsonResult(data,new JsonSerializerSettings());
}

2.结果过滤器替换JSON输出

public class ModifyResultFilter : IAsyncResultFilter
{
    public ModifyResultFilter(IOptions<MvcJsonOptions> optionsAccessor)
    {
        _globalSettings = optionsAccessor.Value.SerializerSettings;
    }

    public async Task OnResultExecutionAsync(
        ResultExecutingContext context,ResultExecutionDelegate next)
    {
        var originResult = context.Result as JsonResult;

        context.Result = new JsonResult(originResult.Value,customSettings);

        await next();
    }
}

在动作/控制器上使用它:

[ServiceFilter(typeof(ModifyResultFilter ))]
public IActionResult Index() {}

或者创建自定义属性,如documentation中所述:

[ModifyResultAttribute]
public IActionResult Index() {}

不要忘记在DI中注册过滤器.

猜你在找的.NET Core相关文章