Web Api 2 路由问题:"No action was found on the controller..."
Web Api 2 Routing Issue: "No action was found on the controller..."
我的网络 api 路由出现 404 问题。虽然有很多关于这个问题的帖子,但它们似乎主要是关于更改路由的顺序,以便 MVC 路由不会覆盖 api 路由。
我已经尝试了我遇到的所有解决方案,但似乎没有任何方法可以解决我的问题。
这是我的控制器:
[RoutePrefix("api/paving-designer")]
public class PavingDesignerController : ApiController
{
[HttpGet]
[Route("get-forms/{userId}")]
public IHttpActionResult GetForms(Guid userId)
{
ICollection<PavingDesignerFlatForm> forms = _helper.GetForms(userId);
if (forms != null)
{
return Ok(forms);
}
else
{
return NotFound();
}
}
}
这是我的网站Api配置
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new
{
id = RouteParameter.Optional
});
}
}
这是我的全局 asax
private void Application_Start(object sender, EventArgs e)
{
// Code that runs on application startup
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
// RouteConfig.RegisterRoutes(RouteTable.Routes);
// Initialize Castle & install application components
_bootstrapper = CastleInitialiser.Initialise();
}
如您所见,我什至尝试注释掉 mvc 路由以查看是否有所不同
如果我浏览到 http://localhost/api/paving-designer/get-forms/c6c489a7-46c6-420e-9e39-56797c8094cf
我收到以下错误:
No type was found that matches the controller named 'paving-designer'.
我已经尝试将路由前缀更改为以下但无济于事
/api/paving-designer
/铺路设计师
铺路设计师
如果我浏览到 http://localhost/api/pavingdesigner/get-forms/c6c489a7-46c6-420e-9e39-56797c8094cf
我收到以下错误:
Multiple types were found that match the controller named 'pavingdesigner'. This can happen if the route that services this request ('api/{controller}/{action}/{id}') found multiple controllers defined with the same name but differing namespaces
我不知道如何拥有多个控制器,因为这是我唯一的控制器。
谁能看出我错在哪里?
您正在使用两种路由类型。
使用属性路由定义下一条路由:
/api/paving-designer/get-forms/{userId}
使用默认路由还有其他路由:
/api/{controller}/{action}/{id}
这些路由具有相同的模板。
但是使用其中的第一个 - ControllerSelector 找不到 paving-designerController。
使用第二个 - 没有名为 get-forms 的操作。有GetForms
如果您删除其中之一 - 它应该可以工作。
好的,在我的特殊情况下,错误是由于我的 IoC 两次注册控制器造成的。
这导致了重复条目,进而导致属性路由失败。
我的网络 api 路由出现 404 问题。虽然有很多关于这个问题的帖子,但它们似乎主要是关于更改路由的顺序,以便 MVC 路由不会覆盖 api 路由。
我已经尝试了我遇到的所有解决方案,但似乎没有任何方法可以解决我的问题。
这是我的控制器:
[RoutePrefix("api/paving-designer")]
public class PavingDesignerController : ApiController
{
[HttpGet]
[Route("get-forms/{userId}")]
public IHttpActionResult GetForms(Guid userId)
{
ICollection<PavingDesignerFlatForm> forms = _helper.GetForms(userId);
if (forms != null)
{
return Ok(forms);
}
else
{
return NotFound();
}
}
}
这是我的网站Api配置
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new
{
id = RouteParameter.Optional
});
}
}
这是我的全局 asax
private void Application_Start(object sender, EventArgs e)
{
// Code that runs on application startup
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
// RouteConfig.RegisterRoutes(RouteTable.Routes);
// Initialize Castle & install application components
_bootstrapper = CastleInitialiser.Initialise();
}
如您所见,我什至尝试注释掉 mvc 路由以查看是否有所不同
如果我浏览到 http://localhost/api/paving-designer/get-forms/c6c489a7-46c6-420e-9e39-56797c8094cf
我收到以下错误:
No type was found that matches the controller named 'paving-designer'.
我已经尝试将路由前缀更改为以下但无济于事
/api/paving-designer
/铺路设计师
铺路设计师
如果我浏览到 http://localhost/api/pavingdesigner/get-forms/c6c489a7-46c6-420e-9e39-56797c8094cf
我收到以下错误:
Multiple types were found that match the controller named 'pavingdesigner'. This can happen if the route that services this request ('api/{controller}/{action}/{id}') found multiple controllers defined with the same name but differing namespaces
我不知道如何拥有多个控制器,因为这是我唯一的控制器。
谁能看出我错在哪里?
您正在使用两种路由类型。
使用属性路由定义下一条路由:
/api/paving-designer/get-forms/{userId}
使用默认路由还有其他路由:
/api/{controller}/{action}/{id}
这些路由具有相同的模板。 但是使用其中的第一个 - ControllerSelector 找不到 paving-designerController。
使用第二个 - 没有名为 get-forms 的操作。有GetForms
如果您删除其中之一 - 它应该可以工作。
好的,在我的特殊情况下,错误是由于我的 IoC 两次注册控制器造成的。
这导致了重复条目,进而导致属性路由失败。