6

我已经使用路由设置了一个 asp.net web api 项目(它与 Mvc 项目完全相同) - 因此我有以下内容

routes.MapHttpRoute(
    name: "API Default",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

所以一切都按我想要的方式工作....我输入 api/Products/15 它到达我的产品控制器,传入 15 作为 id。

伟大的。

我还有 2 个控制器,1 个称为 UploadsController,1 个称为 DownloadsController。这些提供上传和下载(GET / PUT 等)

现在我不希望他们被原始规则所接受(见上文)

但我想要的是使用这 2 个 url 来访问它们

/api/Transport/Uploads/15 /api/Transport/Downloads/15

我已经通过了 15 作为 ID,在现实生活中可能不会发生......只是它有利于演示 :-)

现在运输不存在所以我可以做以下

routes.MapHttpRoute(
    name: "API Default",
    routeTemplate: "api/Transports/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

我相信这有效...

但问题是,如果我这样做

/api/Uploads/15 - 这也会被我不想要的原始规则捕获..

我希望通过假的“传输”而不是没有传输来访问 Uploads 和 Downloads 控制器

任何人都可以帮忙吗?

提前致谢

4

1 回答 1

18

您可以使用路由约束并按以下顺序定义 2 个 API 路由:

// matches /api/transports/downloads/id or /api/transports/uploads/id only
// and no other possible controller
routes.MapHttpRoute(
    name: "API Transport",
    routeTemplate: "api/transports/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional },
    constraints: new { controller = "uploads|downloads" }
);

// matches anything in the form /api/{controller}/id where {controller}
// could be anythnig different than "downloads" or "uploads" because we don't
// want to allow the following urls: /api/downloads/id and /api/uploads/id
routes.MapHttpRoute(
    name: "API Default",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional },
    constraints: new { controller = @"^((?!(downloads|uploads)).)*$" }
);
于 2012-06-20T14:39:04.510 回答