在 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" }
我正在尝试在 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" }