【问题标题】:Bind query and header parameters to the same model将查询和标头参数绑定到同一个模型
【发布时间】:2020-11-09 16:47:33
【问题描述】:

我正在尝试将 Query 和 Header 参数从 Controller 操作绑定到一个模型:

请求模型:

public class MyRequest
{
    [FromQuery]
    public string QueryParameter { get; set; }

    [FromHeader]
    public string HeaderParameter { get; set; }
}

控制器动作:

[HttpGet]
public ActionResult<MyResponse> FooAction(MyRequest myRequest)
{
    ...
}

问题在于:

  1. Swagger 请求输入 json:
{
   "QueryParameter": "string",
   "HeaderParameter": "string"
}
  1. 即使我尝试curl 这个端点,我也会得到“不支持的媒体类型”。

但是,如果我只是在控制器的操作中添加 [FromQuery]:

public ActionResult<MyResponse> FooAction([FromQuery] MyRequest myRequest)

然后它按预期工作。问题在于 - 不太清楚:“如果您有 FromHeader 字段,为什么要添加 FromQuery?”

我可以制作两个单独的模型,一个用于查询参数,另一个用于标头参数,但我真的很想找到一种方法将它们都放入同一个模型中。

【问题讨论】:

  • 如何发送请求? HttpGet 还是 HttpPost?
  • @SelimYıldız 这是一个 GET

标签: c# asp.net asp.net-core asp.net-web-api model-binding


【解决方案1】:

我建议您阅读Model Binding,或直接转到Sources 部分。

这里是关于模型绑定源的总结:

默认情况下,模型绑定从 HTTP 请求中的以下来源以键值对的形式获取数据:表单字段请求正文(对于 ApiControllers)、路由数据查询字符串参数上传的文件

如果默认来源不正确,请使用以下属性之一指定来源:[FromQuery][FromRoute][FromFrom][FromBody][FromHeader]重要提示:这些属性被单独添加到模型属性中(而不是添加到模型类中)。

那么下面的代码将为你工作:

public IActionResult FooAction(MyRequest myRequest)
{
    return new JsonResult(myRequest);
}

public class MyRequest
{
    public string QueryParameter { get; set; }

    [FromHeader]
    public string HeaderParameter { get; set; }
}

【讨论】:

  • 您刚刚从我所看到的问题中复制粘贴了我的代码。它不起作用,至少在默认情况下是这样。你试过了吗?我创建了一个单独的控制器,复制粘贴了您的代码,但我得到了不受支持的媒体类型(就像我的问题中描述的错误一样)。
【解决方案2】:

首先,如果要将数据绑定到HttpGet中的对象,必须使用[FromQuery],否则不会绑定到对象。如果数据是string myRequest而不是MyRequest myRequest .您不需要添加“[FromQuery]”。

另外,如果你使用HttpPost,它也不需要'[FromQuery]':

控制器:

[HttpPost("FooAction")]
        public ActionResult FooAction(MyRequest myRequest)
        {
            return Ok();
        }

结果:

【讨论】:

  • 基本上,您的意思是对于 HttpGet,我需要添加 [FromQuery] MyRequest 以使该功能正常工作,对吗?好吧,这就是我的全部问题:我不想将 FromQuery 用于具有 FromQuery 和 FromHeader 的模型。有办法解决吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-15
  • 2013-07-26
相关资源
最近更新 更多