C# Web API 2路由属性在一个控制器中工作,但在另一个控制器中不工作

C# Web API 2路由属性在一个控制器中工作,但在另一个控制器中不工作,c#,asp.net,asp.net-mvc-4,asp.net-web-api,asp.net-web-api-routing,C#,Asp.net,Asp.net Mvc 4,Asp.net Web Api,Asp.net Web Api Routing,使用.NET 4.5.1、Web API 2、Visual Studio 2013: 我有一个Web API,它有以下路径 /api/供应商/专业 /api/供应商/专业/123 /原料药/供应商/专业/药品 这些工作如预期。。。第一个获取所有专科的列表,第二个获取专科ID 123,第三个获取名称中带有“medicine”的所有专科 我也有这些路线 /api/地点/专业 /api/位置/专业/123 /api/位置/专业/正交 只有最后两项工作。。。第一个返回此错误: No HTTP r

使用.NET 4.5.1、Web API 2、Visual Studio 2013:

我有一个Web API,它有以下路径

  • /api/供应商/专业
  • /api/供应商/专业/123
  • /原料药/供应商/专业/药品
这些工作如预期。。。第一个获取所有专科的列表,第二个获取专科ID 123,第三个获取名称中带有“medicine”的所有专科

我也有这些路线

  • /api/地点/专业
  • /api/位置/专业/123
  • /api/位置/专业/正交
只有最后两项工作。。。第一个返回此错误:

No HTTP resource was found that matches the request URI [...]
No route providing a controller name was found to match request URI 'http://mysite/api/locations/specialties'
这怎么可能?它将击中该控制器中的其他路径,而不是基本路径

(我还有另外两个控制器,它们各自具有路径/api/提供者/api/位置,工作正常。)

以下是ProviderSpecialtyController.cs的代码:

[RoutePrefix("api/providers/specialties")]
public class ProviderSpecialtyController : ApiController
{
    private ProviderEntities db = new ProviderEntities();

    /// <summary>
    /// Get ALL specialties, sorted by name.
    /// </summary>
    [Route("")]
    public IQueryable<ProviderSpecialty> Get()
    {
        return db.ProviderSpecialties.OrderBy(s => s.Name);
    }

    /// <summary>
    /// Get a specific specialty.
    /// </summary>
    /// <param name="id">The ID of a particular specialty.</param>
    [Route("{id:int}")]
    public ProviderSpecialty Get(int id)
    {
        return db.ProviderSpecialties.Where(s => s.Id == id).FirstOrDefault();
    }

    /// <summary>
    /// Get all specialties that contain a keyword.
    /// </summary>
    /// <param name="keyword">The keyword to search for in a specialty name.</param>
    [Route("{keyword:alpha}")]
    public IQueryable<ProviderSpecialty> Get(string keyword)
    {
        return db.ProviderSpecialties.Where(s => s.Name.Contains(keyword)).OrderBy(s => s.Name);
    }
}
[RoutePrefix("api/locations/specialties")]
public class LocationSpecialtyController : ApiController
{
    private ProviderEntities db = new ProviderEntities();

    /// <summary>
    /// Get ALL specialties, sorted by name.
    /// </summary>
    [Route("")]
    public IQueryable<LocationSpecialty> Get()
    {
        return db.LocationSpecialties.OrderBy(s => s.Name);
    }

    /// <summary>
    /// Get a specific specialty.
    /// </summary>
    /// <param name="id">The ID of a particular specialty.</param>
    [Route("{id:int}")]
    public LocationSpecialty Get(int id)
    {
        return db.LocationSpecialties.Where(s => s.Id == id).FirstOrDefault();
    }

    /// <summary>
    /// Get all specialties that contain a keyword.
    /// </summary>
    /// <param name="keyword">The keyword to search for in a specialty name.</param>
    [Route("{keyword:alpha}")]
    public IQueryable<LocationSpecialty> Get(string keyword)
    {
        return db.LocationSpecialties.Where(s => s.Name.Contains(keyword)).OrderBy(s => s.Name);
    }
}

这比看起来要简单,但由于调试不好(在Codeplex中)而使确定原因变得更加困难。这应该从Web API 2.1开始修复。

我有一个控制器,控制着这条路线:

/api/locations/keyword
这将在
关键字上执行关键字搜索

我有另一个控制器,具有以下路径:

/api/locations/specialties
/api/locations/specialties/123
/api/locations/specialties/keyword
API引擎被搞糊涂了,因为我有两个基本上具有相同路由的控制器。我删除了一个,问题就解决了


根据Codeplex问题跟踪器,该问题已被验证、关闭,并添加了一条新的错误消息。

如果您对使用
/api/locations
路线的其他控制器进行注释,那么该路线是否可行?哇,您让我想到了另一个波长,我发现了一些本应显而易见的东西:在我的
中>/api/位置
路线,我允许一条路线
/api/位置/关键字…我确信这会在某种程度上混淆系统。(我按照您的建议进行操作并注释了主要的
/api/位置
路线,谢谢!)只是好奇…你确定你使用的是来自Web API而不是MVC的RoutePrefix和Route属性吗…我这样问是因为根据你的错误消息,你的请求似乎与Web API的传统/传统路由相匹配…你也注册了任何传统路由吗?一个可能的解决方案是只在t中添加一个额外的段他
api/locations/[keyword]
route。类似于
api/locations/search/[keyword]
。仅供参考…我提交了一个与您注意到的问题相关的错误:
/api/locations/specialties
/api/locations/specialties/123
/api/locations/specialties/keyword