首页 > 解决方案 > C# 中的 Azure Functions 模型绑定问题

问题描述

我想使用 Azure Functions 并像在典型的 ASP.NET WebAPI 项目中那样自动解析模型。所以,我写:

[FunctionName("StartJob")]
public async Task<IActionResult> Start(
    [HttpTrigger(AuthorizationLevel.Function, "Post", Route = "v1/job")] StartJobRequestModel model)
{
    this.logger.LogInformation("StartJob function has been entered.");
}

public class StartJobRequestModel
{
    [JsonRequired]
    public string TenantId { get; set; }
    ....
}

因此,您希望如果您不提供必填TenantId字段,基于此代码,在引擎盖下 JSON 反序列化期间,程序甚至不应该进入函数体。但它的作用是:

记录 json 反序列化错误

[2/10/2020 10:59:14 AM] 请求成功匹配名称为“StartJob”且模板为“api/v1/job”的路由

[2/10/2020 10:59:14 AM] JSON 输入格式化程序引发异常。

[2/10/2020 10:59:14 AM] Newtonsoft.Json:在 JSON 中找不到必需的属性“tenantId”。路径'',第 16 行,位置 1。

[2/10/2020 10:59:14 AM] 执行“StartJob”(原因='此函数是通过主机 API 以编程方式调用的。',Id=22be443b-9a70-4570-8a30-1cc9b8062f1b)

[2/10/2020 10:59:16 AM] StartJob 功能已进入。

并在收到非预期模型后继续工作而不会出现意外异常...

问题是:

  1. 这是正常行为吗?
  2. 也许我需要在项目的配置或 Startup.cs 中指定一些特定的参数?
  3. 微软的漏洞?
  4. ???
  5. 不盈利?

谢谢你。

标签: c#jsonjson.netazure-functions

解决方案


不确定您是哪个版本的 NewtonSoft.Json,但通常我使用 JsonProperty 属性而不是 JsonRequired 属性,它按预期工作:

public class StartJobRequestModel
{
    [JsonProperty(Required = Required.Always)]
    public string TenantId { get; set; }
    ....
}

推荐阅读