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

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

我有一个Web API,它有以下路由……

  • / API /提供商/特色菜
  • / API /提供商/特色/ 123
  • / API /供应商/专业/医学

这些按预期工作……第一个获得所有专业的列表,第二个获得专业ID 123,第三个获得名称中的“药”所有专业。

我也有这些路线……

  • / 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 / providers/ api / locations本身,工作正常。)

这是ProviderSpecialtyController.cs代码:

 [RoutePrefix("api/providers/specialties")] public class ProviderSpecialtyController : ApiController { private ProviderEntities db = new ProviderEntities(); ///  /// Get ALL specialties, sorted by name. ///  [Route("")] public IQueryable Get() { return db.ProviderSpecialties.OrderBy(s => s.Name); } ///  /// Get a specific specialty. ///  /// The ID of a particular specialty. [Route("{id:int}")] public ProviderSpecialty Get(int id) { return db.ProviderSpecialties.Where(s => s.Id == id).FirstOrDefault(); } ///  /// Get all specialties that contain a keyword. ///  /// The keyword to search for in a specialty name. [Route("{keyword:alpha}")] public IQueryable Get(string keyword) { return db.ProviderSpecialties.Where(s => s.Name.Contains(keyword)).OrderBy(s => s.Name); } } 

这是LocationSpecialtyController.cs代码:

 [RoutePrefix("api/locations/specialties")] public class LocationSpecialtyController : ApiController { private ProviderEntities db = new ProviderEntities(); ///  /// Get ALL specialties, sorted by name. ///  [Route("")] public IQueryable Get() { return db.LocationSpecialties.OrderBy(s => s.Name); } ///  /// Get a specific specialty. ///  /// The ID of a particular specialty. [Route("{id:int}")] public LocationSpecialty Get(int id) { return db.LocationSpecialties.Where(s => s.Id == id).FirstOrDefault(); } ///  /// Get all specialties that contain a keyword. ///  /// The keyword to search for in a specialty name. [Route("{keyword:alpha}")] public IQueryable Get(string keyword) { return db.LocationSpecialties.Where(s => s.Name.Contains(keyword)).OrderBy(s => s.Name); } } 

如您所见,除路由前缀外,它们几乎完全相同。 为什么提供程序控制器按预期工作但位置控制器不工作?

我启用了跟踪,在尝试命中/ api / locations / special时会发现以下情况:

 System.Web.Http.Request: GET http://localhost:49565/api/locations/specialties/: Category=System.Web.Http.Request, Level=Info Begin http://localhost:49565/api/locations/specialties/ System.Web.Http.Controllers: GET http://localhost:49565/api/locations/specialties/: Category=System.Web.Http.Controllers, Level=Info Begin DefaultHttpControllerSelector SelectController Route='MS_SubRoutes:System.Web.Http.Routing.IHttpRouteData[]' [...] System.Web.Http.Controllers: GET http://localhost:49565/api/locations/specialties/: Category=System.Web.Http.Controllers, Level=Error End DefaultHttpControllerSelector SelectController Processing of the HTTP request resulted in an exception. Please see the HTTP response returned by the 'Response' property of this exception for details. 

这比看起来简单得多,但是由于调试不当(由Kiran Challa 提交并validation为 Codeplex中的错误 ,因此确定原因更加困难。 这应该在Web API 2.1中修复。

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

 /api/locations/keyword 

哪个会对关键字进行关键字搜索。

我有另一个控制器与这些路线:

 /api/locations/specialties /api/locations/specialties/123 /api/locations/specialties/keyword 

API引擎很困惑,因为我有两个基本相同路径的控制器。 我删除了一个,问题得到解决。

根据Codeplex问题跟踪器,该问题已经过validation,已关闭,并在Web API 2.1中添加了一条新的错误消息。