我已经装饰了api控制器,例如:
[RoutePrefix("api/admin/notification")] public class LanguageController : BaseController
在里面,我有一个获取端点:
[HttpGet]
[Route("app/{productGuid}")]
public async Task<IHttpActionResult> GetAllNotificationsForApp([FromUri]string productGuid)
现在,我假设访问该资源的正确方法是:
GET http://[api-url]/api/admin/notification/app/someguid
但是,这会产生404。
我试过的是:
-Removing [FromUri]
-Passing productGuid作为querystring的一部分,即.../app?productGuid=something
(相对于/app/{productGuid}
)
是的,我正在使用config.MapHttpAttributeRoutes();
,并且我已经验证了其他也使用RoutePrefix工作的api控制器。
我是不是遗漏了什么?
发布于 2016-05-31 14:18:15
事实证明,即使两个api控制器被映射到不同的路由,也不能有两个类名相同的api控制器。
我有另一个名为LanguageController
的控制器,位于不同的名称空间中,并映射到不同的路由;为了使其工作,我必须重命名其中的一个。
发布于 2016-05-30 23:54:33
[FromUri]
用于强制Web从URI中读取复杂类型。移除它应该有效的。
您还可以查看如何将参数从string
更改为Guid
,并对路由中的占位符应用适当的约束。ie:[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 }
);
}
}
https://stackoverflow.com/questions/37534461
复制相似问题