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 两次注册控制器造成的。

这导致了重复条目,进而导致属性路由失败。