webapi 5.2.3发现多个控制器类型与URL-属性路由匹配

本文关键字:URL- 属性 路由 类型 控制器 发现 webapi | 更新日期: 2023-09-27 18:29:44

我遇到了一个webapi属性路由问题。我调用以下路由:assessment/assessments/assessmenttypes作为HttpPost。我得到一个错误,多个控制器类型匹配的网址。问题是他们绝对不匹配。最初,当我第一次遇到这个问题时,我使用了不同的路由前缀,但我读到webapi可以忽略路由前缀,所以我更改了所有路由以使其唯一,因此"匹配控制器"中唯一的HttpPost定义如下:

[Route("assessments"), HttpPost] public async Task<System.Int32> PostCreate([FromBody]Assessment assessment)

[Route("assessments/assessmenttypes"), HttpPost] public async Task<System.Int32> PostCreate([FromBody]AssessmentType assessmentType)

两个控制器具有相同的RoutePrefix:[RoutePrefix("assessment")]

有人能帮忙吗?这太令人沮丧了。

提前感谢!

webapi 5.2.3发现多个控制器类型与URL-属性路由匹配

首先需要了解的是路由是如何工作的,这是解决问题的关键。如果你给我更多信息,我可以稍后更新我的答案(目前看起来你没有发布所有需要的信息)

正如您所知,路由是将请求与路由相匹配的过程。神奇的处理程序是HttpRoutingDispatcher,它借助于一些额外的库,但基本上是由调度器来解决请求。处理路线的最终目标是识别两个元素:

  • 路线

解析管线有两种不同的方法,基于约定(模板)或按属性。保持一致性是一个好主意,以避免混淆,特别是在应用程序增长时。路由有两个不同的部分,固定段(它们必须完全匹配)和变量(用{}表示)

请求动词有两种不同的匹配方式,属性为[HttpGet][HttpPost][HttpPut]或者,在我看来,使用该方法的第一部分令人困惑的是,如果你有3种不同的方法没有标记属性,WebApi假设第一个字母试图指示动词:

  • GetList-->列表的HttpGet
  • GetDetail-->HttpGet of Detail
  • PostDetail-->HttpPost of Detail

从官方文档中,如果您尝试以下模板:

routeTemplate: "api/{controller}/{id}"

然后您从Ajax发出如下请求:

$.ajax("/api/today/dayofweek", {

以下控制器将出现故障(几乎总是)

公共类TodayController:ApiController{

[HttpGet]
public string DayOfWeek() {
   return DateTime.Now.ToString("dddd");
}
[HttpGet]
public int DayNumber() {
   return DateTime.Now.Day;
}

因为几乎不可能确定哪一个是正确的(人类当然可以,但不幸的是,机器需要更多的编程才能使用模糊逻辑):)

在你的情况下,问题不是从同一条固定路线开始,问题是无法确定你说的第二部分是属于变量还是固定部分(这很模糊)给你一个例子;我们如何才能确定这一点的意义?

  • /segmenta/segmentb
  • /segmenta/segmentb/segmentc(segmentc是固定路线还是参数?)

从建筑的角度来看,现实是(基于Api设计),我不认为/assestmenttypes是/assestments的附属资源。如果您想设计RESTful ROA,如果Api assestment类型依赖于assestment(作为子项,而不是属性),则该类型将正确地指示为资源。我建议你也复习一下自己的道路。