【问题标题】:C# Set Casing Convention Globally for Azure Function v3C# 为 Azure Function v3 全局设置大小写约定
【发布时间】:2020-11-18 03:41:37
【问题描述】:

我是 Azure Functions 的新手,正在尝试将 .NET Core API 转换为 Azure Functions。我面临的问题是如何全局设置响应命名约定(JSON)。默认情况下,它是CamelCase,但我想使用PascalCase,我在互联网上找到的所有解决方案都是修改每个函数/端点中的响应。我想全局设置

我已经添加了Startup.cs 来配置 DI。这是我尝试配置响应 JSON 命名约定的尝试:

public override void Configure(IFunctionsHostBuilder builder)
{
    builder.Services.AddMvcCore().AddJsonOptions(m =>
    {
        m.JsonSerializerOptions.PropertyNamingPolicy = null;
    });

    builder.Services.Configure<JsonSerializerSettings>(m =>
    {
        m.ContractResolver = new DefaultContractResolver();
    });

    builder.Services.Configure<JsonSerializerOptions>(m =>
    {
        m.DictionaryKeyPolicy = null;
        m.PropertyNamingPolicy = null;
    });

    builder.Services.Configure<JsonOptions>(m =>
    {
        m.JsonSerializerOptions.DictionaryKeyPolicy = null;
        m.JsonSerializerOptions.PropertyNamingPolicy = null;
    });

    .....
}

函数示例(都返回相同的响应,即 CamelCased):

[FunctionName(nameof(Get))]
public async Task<IEnumerable<AppComponentViewModel>> Get([HttpTrigger(AuthorizationLevel.Function, "get", Route = "AppComponent/Get")] HttpRequest request)
{
    var appComponents = await _appComponentRepository.GetAll();
    return ToList(appComponents);
}

[FunctionName(nameof(Get))]
public async Task<ActionResult<IEnumerable<AppComponentViewModel>>> Get([HttpTrigger(AuthorizationLevel.Function, "get", Route = "AppComponent/Get")] HttpRequest request)
{
    var appComponents = await _appComponentRepository.GetAll();
    return Ok(ToList(appComponents));
}

【问题讨论】:

    标签: c# azure .net-core json.net azure-functions


    【解决方案1】:

    默认情况下,Azure 函数宿主使用“Newtonsoft.Json”,而不是 .net core 3+ 中引入的“System.Text,Json”。您可以使用Startup.cs 中的以下代码来覆盖 MVC Json 序列化行为,这将保留您的属性名称大小写与实体类中的大小写相同。在下面的代码中,它将不再转换为camelCase,但同时也不会显式转换为PascalCase。它与 C# 对象相同。

    注意:添加 nuget Microsoft.AspNetCore.Mvc.NewtonsoftJson 版本 3.1.*(至少在函数开始支持 .net 5 之前不是最新的 5)。

            public override void Configure(IFunctionsHostBuilder builder)
            {
                builder.Services.AddMvc()
                    .AddNewtonsoftJson(o =>
                    {
                        o.SerializerSettings.ContractResolver = new DefaultContractResolver();
                    });
            }
    

    如果您想对所有内容都强制使用 Pascal 大小写,而不管 C# 对象中的大小写是什么,那么您可以创建您的 NamingStrategy 类来拥有该逻辑并分配它。

        public class MyNamingStrategy : NamingStrategy
        {
            protected override string ResolvePropertyName(string s)
            {
                // add logic to force name to desired casing
            }
        }    
    
            public override void Configure(IFunctionsHostBuilder builder)
            {
                builder.Services.AddMvc()
                    .AddNewtonsoftJson(o =>
                    {
                        o.SerializerSettings.ContractResolver = new DefaultContractResolver
                        {
                            NamingStrategy = new MyNamingStrategy()
                        };
                    });
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-03
      • 1970-01-01
      • 1970-01-01
      • 2013-06-16
      • 2023-02-11
      • 2021-02-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多