WebApi2 RoutePrefix和端点Route =未找到

时间:2016-05-30 22:41:57

标签: c# .net asp.net-web-api

我装饰了我的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控制器。

我错过了什么吗?

2 个答案:

答案 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的控制器,位于不同的命名空间中并映射到不同的路由;我不得不重命名其中一个以使其正常工作。

基于Different RoutePrefix, same controller name