如何重载基于 HttpPost Web API 方法的 Json 数据类型属性

How to Overload HttpPost Web API Method Based Json Datatype Properties

我被要求实现一个 REST Web API 到一个特定的路由,其中​​可以发布两种不同的 Json 数据类型中的任何一种。

这会导致抛出以下异常:

Microsoft.AspNetCore.Routing.Matching.AmbiguousMatchException: The request matched multiple endpoints.

是否有可以放置在 Web 方法上的属性,引用 Json 有效负载的属性以消除两种可能的数据类型的歧义?

但我会补充一点。

这样做并不好 API 设计,并且违反了 Swagger / OpenAPI 规范来执行您的要求。

使用相同的 HTTP 方法(POST 在您的情况下)执行此操作的唯一方法是在两个模型中执行一个操作。检查哪个不为空,然后路由到正确的方法来处理该逻辑。

如果您可以使用不同的 HTTP 动词,您可以在技术上做到这一点,并有两个单独的操作方法(如 POST 和 PUT),但您不会“正确”使用它们,并且根据您的问题和需要,我怀疑您是否能做到这一点。

您可以将请求正文作为字符串读取,然后尝试确定要反序列化的类型:

[HttpPost]
[Route("api/mypath")]
public async Task<IActionResult> MyMethod()
{
  request.Body.Position = 0;

  var reader = new StreamReader(request.Body, Encoding.UTF8);

  var body = await reader.ReadToEndAsync();

  if(body.Contains("A))
  {
     var A = JsonConvert.DeserializeObject<A>(body);
  }
  else{
     var B = JsonConvert.DeserializeObject<B>(body);
  }
}

并添加一个中间件来启用请求缓冲:

app.Use(next => context => {
    context.Request.EnableBuffering();
    return next(context);
});

您可以阅读更多相关信息here