在 Asp.Net Core 中设置 JsonContent 的默认值

Setting defaults for JsonContent in Asp.Net Core

我正在尝试在 Asp.Net Core 6.0 中发送一个包含多部分表单数据(一个文件和一个 Json 字段)的 POST 请求。代码的相关部分是

...

using var request = new HttpRequestMessage(HttpMethod.Post, "myrequest");
using var content = new MultipartFormDataContent
{
    {new StreamContent(image), "data", "file.ext"},
    {JsonContent.Create(myObject), "Object"}
};
request.Content = content;
using var res = await _httpClient.SendAsync(request);

...

这有效,除了公司政策是以 PascalCase 序列化 Json 字段,而 JsonContent 使用的 JsonSerializerDefaults.Web 默认为驼峰式。

我可以通过写

来修复这个特定的实例
{JsonContent.Create(myObject, null, new JsonSerializerOptions() { PropertyNamingPolicy = null }), "Object"}

但问题就变成了我必须在构建此类请求的任何地方执行此操作。

我的问题:我可以在某处为 JsonContent 全局设置 PascalCase 吗?

我可以通过 builder.Services.AddControllers().AddJsonOptions(options => options.JsonSerializerOptions.PropertyNamingPolicy = null); 为控制器设置这个, 并且有诸如 之类的问题,但其中 none 似乎适用于 JsonContent in Asp.Net Core with System.Text.Json.

据我所知,没有选项告诉 JsonContent.Create() 使用全局 JsonSerializerOptions.

BUT 您可以使用 options pattern 检索全局 JsonSerializerOptions,您已添加 AddJsonOptions(...);.

Program.cs:

builder.Services.AddControllers().AddJsonOptions(options =>
{
    options.JsonSerializerOptions.PropertyNamingPolicy = null;
});

控制器中注入的选项:

private readonly IOptions<JsonOptions> _JsonOptions;

public YourController(IOptions<JsonOptions> options)
{
    _JsonOptions = options;
}

...

// in your request method:
using var request = new HttpRequestMessage(HttpMethod.Post, "myrequest");
using var content = new MultipartFormDataContent
{
    { new StreamContent(image), "data", "file.ext" },
    { JsonContent.Create(wfc, null, JsonOptions.Value.JsonSerializerOptions), "Object" }
};
request.Content = content;
using var res = await _httpClient.SendAsync(request);

...

为了进一步简化事情,您可以使用静态辅助方法,这样您就不需要传递类型,只需传递选项即可。

PascalCaseHelper.cs:

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;

using System.Net.Mime;
using System.Text;
using System.Text.Json;

namespace YourNamespace
{
    public static class PascalCaseHelper
    {
        public static StringContent CreateJson(object data, IOptions<JsonOptions> options)
        {
            return new StringContent(
                JsonSerializer.Serialize(data, options.Value.JsonSerializerOptions), 
                Encoding.UTF8,
                MediaTypeNames.Application.Json);
        }
    }
}


// Usage:
{ PascalCaseHelper.CreateJson(myObject, _JsonOptions), "Object" }