C# 在ASP.NET核心API中将单个对象和对象集合发布到同一端点?

C# 在ASP.NET核心API中将单个对象和对象集合发布到同一端点?,c#,asp.net,routing,C#,Asp.net,Routing,我正在寻找一种方法,使ASP.NET Core 2.0中的同一终结点既可以接受单个终结点,也可以接受集合终结点,但不知道如何使其工作: [HttpPost] [Route("")] public ActionResult<string> Post([FromBody] SampleModel model) { return "Single"; } [HttpPost] [Route("")] publi

我正在寻找一种方法,使ASP.NET Core 2.0中的同一终结点既可以接受单个终结点,也可以接受集合终结点,但不知道如何使其工作:

    [HttpPost]
    [Route("")]
    public ActionResult<string> Post([FromBody] SampleModel model)
    {
        return "Single";
    }

    [HttpPost]
    [Route("")]
    public ActionResult<string> Post([FromBody] SampleModel[] models)
    {
        return "Multiple";
    }
以及

[
  {
    "name": "Multi1"
  },
  {
    "name": "Multi2"
  }
]
到同一个端点-api/sample/

使用自定义模型活页夹等是否可以实现这一点


这似乎是API支持的一件好事。

您可以声明一个从主体获取JToken的操作,然后根据您可以反序列化令牌的类型调用所需的方法

private ActionResult<string> Single(SampleModel model)
{
  return "Single";
}

private ActionResult<string> Multiple(SampleModel[] models)
{
  return "Multiple";
}

private bool TryToObject<T>(JToken token, out T value)
{
  try
  {
    value = token.ToObject<T>();
    return true;
  }
  catch (Exception) { }
  value = default(T);
  return false;
}

[HttpPost]
[Route("")]
public ActionResult<string> Post([FromBody] JToken token)
{
  if (TryToObject(token, out SampleModel[] models))
    return Multiple(models);
  else if (TryToObject(token, out SampleModel model))
    return Single(model);
  else
    return BadRequest();
}

现在尝试寻找JObject的挑战是识别对象或集合,所以在这种情况下,如果你的对象转换成功,那么它是平均对象,否则它是collectino。@Parwej是的,我将其视为一种解决方案,但你失去了所有建模的优点。谢谢!JToken是解决问题的关键!:D
private ActionResult<string> Single(SampleModel model)
{
  return "Single";
}

private ActionResult<string> Multiple(SampleModel[] models)
{
  return "Multiple";
}

private bool TryToObject<T>(JToken token, out T value)
{
  try
  {
    value = token.ToObject<T>();
    return true;
  }
  catch (Exception) { }
  value = default(T);
  return false;
}

[HttpPost]
[Route("")]
public ActionResult<string> Post([FromBody] JToken token)
{
  if (TryToObject(token, out SampleModel[] models))
    return Multiple(models);
  else if (TryToObject(token, out SampleModel model))
    return Single(model);
  else
    return BadRequest();
}