【问题标题】:How to use [FromHeader] attribute with custom model binding in Asp.Net Core 2.2如何在 Asp.Net Core 2.2 中将 [FromHeader] 属性与自定义模型绑定一起使用
【发布时间】:2020-09-28 23:24:37
【问题描述】:

我需要在我的请求中添加许多自定义标头。我可以使用这样的东西

public ActionResult Get([FromHeader, Required]string header1, [FromHeader]string  header2, ... , [FromHeader]string headerx)
{
...
...
}

我不确定在一种方法中使用这么多参数是否合适。 我想用这样的东西

public class HeaderParameters 
{
  [Required]
  public string Header1 { get; set; }
  public string Header2 { get; set; }
  ...
  public string Headerx { get; set; }
}

public ActionResult Get([FromHeader]HeaderParameters headerParameters)
{
  ...
  ...
}

但它不起作用。

如果我对 HeaderParameters 类的每个属性都使用 [FromHeader] 属性,那么 Swagger 会表现得很奇怪。

Request example http://prntscr.com/p14kd7

{
  "errors": {
    "Device": [
      "The Header1 field is required."
    ]
  },
  "title": "One or more validation errors occurred.",
  "status": 400,
  "traceId": "0HLPG9SNNJ1U2:00000001"
}

【问题讨论】:

    标签: c# asp.net-web-api


    【解决方案1】:

    .Net Core 3.1 中的 ASP.NET Core 中有一种更简单的方法。只需将[FromHeader] 放在任何地方,就像这样:

    [HttpPost("multipleHeaders")]
    public IActionResult Post([FromHeader] ForecastHeaders forecastHeaders)
    {
        try
        {
            Console.WriteLine($"Got a forecast for city: {forecastHeaders.City}," +
                                $"temperature: {forecastHeaders.TemperatureC} and" +
                                $"description: {forecastHeaders.Description}!");
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
            return StatusCode(StatusCodes.Status500InternalServerError);
        }
    
        return new AcceptedResult();
    }
    

    ForecastHeaders 看起来像这样:

    public class ForecastHeaders
    {
        [FromHeader]
        public string City { get; set; }
    
        [FromHeader]
        public int TemperatureC { get; set; }
    
        [FromHeader]
        public string Description { get; set; }
    
        [FromQuery]
        public string Sorting { get; set; }
    }
    

    当您向 Postman 发送请求时:

    它就像一个魅力:

    只需将[FromHeader] 放在任何地方。也可以使用[FromQuery]

    【讨论】:

      【解决方案2】:

      能够通过在模型属性上使用[FromHeader] 属性和在模型本身上使用[FromQuery] 属性来欺骗模型绑定来使其工作。这样的设置可以让 Swagger 正确识别每个头参数。

      控制器端点示例:

          [HttpGet]
          [Route("headers")]
          public ActionResult<string> Get([FromQuery] HeadersParameters parameters = null)
          {
              return JsonConvert.SerializeObject(parameters);
          }
      

      HeadersParameters 声明:

          public class HeadersParameters
          {
              [FromHeader]
              [Required]
              public string Header1 { get; set; }
      
              [FromHeader]
              public string Header2 { get; set; }
          }
      

      【讨论】:

      • 谢谢,它有效。 API 能够接收标头。但据我了解,Swagger 存在问题。它生成以下 curl CURL -X ... -H "parameters: header1,string,header2,string"
      • @IvanBerezhnyk 编辑了我的答案 - 现在它也适用于 Swagger。诀窍是在模型本身上使用 [FromQuery],因此它适用于 GET 方法。
      【解决方案3】:

      我创建了一个自定义属性以避免误解。

      [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
      public class FromHeaderModelAttribute : Attribute, IBindingSourceMetadata, IModelNameProvider
      {
              public BindingSource BindingSource => BindingSource.Query;
      
              public string Name { get; set; }
      }
      

      所以,最终结果是:

      [HttpGet]
      [Route("headers")]
      public ActionResult<string> Get([FromHeaderModel] HeadersParameters parameters = null)
      {
          return JsonConvert.SerializeObject(parameters);
      }
      
      public class HeadersParameters
      {
          [FromHeader]
          [Required]
          public string Header1 { get; set; }
      
          [FromHeader]
          public string Header2 { get; set; }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-05
        • 1970-01-01
        • 1970-01-01
        • 2018-12-11
        • 1970-01-01
        • 1970-01-01
        • 2022-06-11
        • 2018-01-02
        相关资源
        最近更新 更多