我装饰了我的api控制器,例如:
[RoutePrefix("api/admin/notification")]
public class LanguageController : BaseController
在内部,我有这个GET端点:
[HttpGet]
[Route("app/{productGuid}")]
public async Task<IHttpActionResult> GetAllNotificationsForApp([FromUri]string productGuid)
现在,我假设访问此资源的正确方法是:
GET http://[api-url]/api/admin/notification/app/someguid
但是,这会产生404。
我尝试过:
- 删除[FromUri]
- 将productGuid作为查询字符串的一部分,即.../app?productGuid=something
(与/app/{productGuid}
相对)
是的,我正在使用config.MapHttpAttributeRoutes();
并且我已经验证了其他也使用RoutePrefix工作的api控制器。
我错过了什么吗?
答案 0 :(得分:1)
[FromUri]
用于强制Web API从URI中读取复杂类型。删除它应该有效。
您还可以考虑将参数从string
更改为Guid
,并将适当的约束应用于路径中的占位符。即:[Route("app/{productGuid:guid}")]
[RoutePrefix("api/admin/notification")]
public class LanguageController : BaseController {
//GET: api/admin/notification/app/{guid}
[HttpGet]
[Route("app/{productGuid:guid}")]
public async Task<IHttpActionResult> GetAllNotificationsForApp(Guid productGuid) {...}
}
其他要检查的事项:
确保在基于约定的路线之前完成config.MapHttpAttributeRoutes();
。当第一场比赛获胜时,顺序很重要。
public static class WebApiConfig {
public static void Register(HttpConfiguration config) {
// Attribute routing.
config.MapHttpAttributeRoutes();
// Convention-based routing.
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
答案 1 :(得分:1)
事实证明,即使它们被映射到不同的路线,也不能有两个具有相同类名的api控制器。
我有另一个名为LanguageController
的控制器,位于不同的命名空间中并映射到不同的路由;我不得不重命名其中一个以使其正常工作。