C# Web API 2路由属性在一个控制器中工作,但在另一个控制器中不工作
使用.NET 4.5.1、Web API 2、Visual Studio 2013: 我有一个Web API,它有以下路径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
- /api/供应商/专业
- /api/供应商/专业/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/提供者和/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