webapi 5.2.3 发现多个控制器类型匹配 URL - 属性路由
webapi 5.2.3 Multiple controller types were found that match the URL - Attribute Routing
我遇到了 webapi 属性路由问题。我正在调用以下路由:assessment/assessments/assessmenttypes
作为 HttpPost
。我收到多个控制器类型匹配 url 的错误。问题是他们肯定不匹配。最初当我第一次遇到这个问题时,我使用了不同的路由前缀,但是我读到 webapi 可以忽略路由前缀,所以我更改了所有路由以使其唯一,因此 [=] 中唯一的 HttpPost
s 31=]定义如下:
[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")]
谁能帮忙,这很令人沮丧。
提前致谢!
你首先需要了解的是路由是如何工作的,这是解决你问题的关键。如果你给我更多信息,我可以稍后更新我的答案(目前看来你没有 post 所有必需的信息)
如您所知,路由是将请求匹配到路由的过程。
发挥魔力的处理程序是 HttpRoutingDispatcher,在一些额外的库的帮助下,但基本上调度程序会解析请求。处理路由的最终目标是识别两个元素:
- 路线
- 值
您有两种不同的解析路由的方法,convention-based(模板)或通过属性。最好保持一致以避免混淆,特别是在应用程序增长时。
路由有两个不同的部分,固定段(它们必须完全匹配)和变量(用{}表示)
请求动词以两种不同的方式匹配,具有属性
[HttpGet] [HttpPost] [HttpPut]
或者在我看来使用方法的第一部分令人困惑,如果你有 3 种不同的方法没有标记属性 WebApi 假定第一个字母试图指示动词:
- GetList --> List 的 HttpGet
- GetDetail --> HttpGet 详情
- PostDetail --> HttpPost 详情
如果您尝试使用以下模板,则来自官方文档:
routeTemplate: "api/{controller}/{id}"
然后您从 Ajax 发出如下请求:
$.ajax("/api/today/dayofweek", {
以下控制器将失败(几乎总是)
public class TodayController : ApiController {
[HttpGet]
public string DayOfWeek() {
return DateTime.Now.ToString("dddd");
}
[HttpGet]
public int DayNumber() {
return DateTime.Now.Day;
}
因为几乎不可能确定哪一个是正确的(人类当然可以,但不幸的是机器需要更多的编程才能使用模糊逻辑):)
你的问题不是都从相同的固定路线开始,问题是无法确定你是说第二部分属于变量还是固定部分(含糊不清)
举个例子;我们如何确定其含义?
- /segmenta/segmentb
- /segmenta/segmentb/segmentc(c段是固定路由还是参数?)
从体系结构的角度来看,现实是(基于 Api 设计)我不认为 /assestmenttypes 是 /assestments 的从属资源。如果您想设计 RESTful ROA Api,如果类型取决于评估(作为 child,而不是作为属性),则资产类型被正确地指示为资源。
我建议你也检查一下你的路径。
我遇到了 webapi 属性路由问题。我正在调用以下路由:assessment/assessments/assessmenttypes
作为 HttpPost
。我收到多个控制器类型匹配 url 的错误。问题是他们肯定不匹配。最初当我第一次遇到这个问题时,我使用了不同的路由前缀,但是我读到 webapi 可以忽略路由前缀,所以我更改了所有路由以使其唯一,因此 [=] 中唯一的 HttpPost
s 31=]定义如下:
[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")]
谁能帮忙,这很令人沮丧。
提前致谢!
你首先需要了解的是路由是如何工作的,这是解决你问题的关键。如果你给我更多信息,我可以稍后更新我的答案(目前看来你没有 post 所有必需的信息)
如您所知,路由是将请求匹配到路由的过程。 发挥魔力的处理程序是 HttpRoutingDispatcher,在一些额外的库的帮助下,但基本上调度程序会解析请求。处理路由的最终目标是识别两个元素:
- 路线
- 值
您有两种不同的解析路由的方法,convention-based(模板)或通过属性。最好保持一致以避免混淆,特别是在应用程序增长时。 路由有两个不同的部分,固定段(它们必须完全匹配)和变量(用{}表示)
请求动词以两种不同的方式匹配,具有属性 [HttpGet] [HttpPost] [HttpPut] 或者在我看来使用方法的第一部分令人困惑,如果你有 3 种不同的方法没有标记属性 WebApi 假定第一个字母试图指示动词:
- GetList --> List 的 HttpGet
- GetDetail --> HttpGet 详情
- PostDetail --> HttpPost 详情
如果您尝试使用以下模板,则来自官方文档:
routeTemplate: "api/{controller}/{id}"
然后您从 Ajax 发出如下请求:
$.ajax("/api/today/dayofweek", {
以下控制器将失败(几乎总是)
public class TodayController : ApiController {
[HttpGet]
public string DayOfWeek() {
return DateTime.Now.ToString("dddd");
}
[HttpGet]
public int DayNumber() {
return DateTime.Now.Day;
}
因为几乎不可能确定哪一个是正确的(人类当然可以,但不幸的是机器需要更多的编程才能使用模糊逻辑):)
你的问题不是都从相同的固定路线开始,问题是无法确定你是说第二部分属于变量还是固定部分(含糊不清) 举个例子;我们如何确定其含义?
- /segmenta/segmentb
- /segmenta/segmentb/segmentc(c段是固定路由还是参数?)
从体系结构的角度来看,现实是(基于 Api 设计)我不认为 /assestmenttypes 是 /assestments 的从属资源。如果您想设计 RESTful ROA Api,如果类型取决于评估(作为 child,而不是作为属性),则资产类型被正确地指示为资源。 我建议你也检查一下你的路径。