在ASP.NET WebAPI中,我知道您可以使用global.aspx中的CamelCasePropertyNamesContractResolver()将默认的json格式化程序设置为使用驼峰大小写,这将强制所有json序列化为驼峰大小写.
但是,我需要能够在"每个控制器"实例上设置它,而不是全局解决方案.
这可能吗?
许多SO线程都涵盖了在应用程序级别覆盖Web API的默认JSON序列化程序设置.但是如何在动作级别配置其设置?例如,我可能想要在我的一个操作中使用camelcase属性进行序列化,但不能在其他操作中进行序列化.
我正在将旧的 ASP.NET WebAPI 2.1 项目重写为 ASP.NET Core MVC 2.1。我面临的问题之一是移植服务的旧行为,该服务通过实现 IControllerConfiguration 接口的自定义属性来配置输入和输出格式化程序。除了使用 AddMvc(options) 方法在全局级别注入它们之外,我无法找到此接口的替代品,也找不到在控制器上配置格式化程序的任何替代方法。
XYZController.cs
[HttpPost]
public async Task<ActionResult> Post([FromBody] T inputContext)
{
var outputContext = Process(inputContext);
return StatusCode(200, outputContext );
}
Run Code Online (Sandbox Code Playgroud)
启动文件
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().AddJsonOptions(options =>
{
UpdateJsonSettings.ConfigureJsonFormatter(options.SerializerSettings);
});
}
Run Code Online (Sandbox Code Playgroud)
更新JsonSettings.cs
internal static void ConfigureJsonFormatter(JsonSerializerSettings settings)
{
settings.ContractResolver = new CamelCasePropertyNamesContractResolver();
settings.PreserveReferencesHandling = PreserveReferencesHandling.Objects;
settings.Converters.Add(new StringEnumConverter());
}
Run Code Online (Sandbox Code Playgroud)
XYZ 控制器的 HttpResponse 尝试 1:
{ "$id": "1", "bill": { "$id": "2", "type": "TYPE1",
XYZ 控制器的 HttpResponse 尝试 2: -- 不以 $id 1 开头
{ "$id": "28", <--- 不知道为什么第二个请求 $ID 以 28 开头 …
我有一个自定义过滤器属性,改编自当前为 .NET Core 2.2 实现的这个答案,我想适应 3.1。它引用了 Newtonsoft.JSON,出于兼容性原因,我更愿意保持这种方式。
代码如下:
public class AllPropertiesAttribute : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext ctx)
{
if (!(ctx.Result is ObjectResult objectResult)) return;
var serializer = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Include };
serializer.Converters.Add(new StringEnumConverter());
var formatter = new JsonOutputFormatter(serializer,
ctx.HttpContext.RequestServices.GetRequiredService<ArrayPool<char>>());
objectResult.Formatters.Add(formatter);
}
}
Run Code Online (Sandbox Code Playgroud)
JsonOutputFormatter根据官方文档,仅支持 .net core 2.2 ;我应该如何继续在 3.1 下保持相同的行为?