Web Api 2路由问题:"在控制器上找不到任何操作"

本文关键字:quot 控制器 找不到 任何 操作 Api 问题 Web 路由 | 更新日期: 2023-09-27 18:17:55

我在我的web 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();
        }
    }
}
这是我的Web 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
            });
    }
}

这是我的全局变量

    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

我得到以下错误:

没有找到与名为' pave -designer'的控制器匹配的类型。

我已经尝试将路由前缀更改为以下内容,但无济于事

/api/paving-designer
/paving-designer
paving-designer

打开http://localhost/api/pavingdesigner/get-forms/c6c489a7-46c6-420e-9e39-56797c8094cf

我得到以下错误:

发现多个类型匹配名为'pavingdesigner'的控制器。如果服务此请求的路由('api/{controller}/{action}/{id}')发现多个具有相同名称但不同命名空间的控制器

,就会发生这种情况。

我不知道我怎么能有多个控制器,因为这是我唯一的一个。

有人能看出我错在哪里吗?

Web Api 2路由问题:"在控制器上找不到任何操作"

您正在使用两种路由类型。

使用属性路由定义下一条路由:

/api/paving-designer/get-forms/{userId}

使用默认路由存在其他路由:

/api/{controller}/{action}/{id}

这些路由具有相同的模板。但是使用其中的第一个- ControllerSelector无法找到pave - designercontroller。

使用第二个-没有名为get-forms的操作。有GetForms

如果你删除其中一个-它应该工作

在我的特殊情况下,错误是由于我的IoC注册了两次控制器而引起的。

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