Web API 路由和 Web API 帮助页面:如何避免重复输入
Web API routing and a Web API Help Page: how to avoid repeated entries
我在 Web API Help Page 中使用不同的 parents 重复呈现条目,例如这些引用相同方法的条目:
GET api/{apiVersion}/v1/Products - Gets all products
...
GET api/v1/Products - Gets all products
...
我有一个 Web API 页面,其中包含如下路由:
config.Routes.MapHttpRoute (
name: "DefaultVersionApi",
routeTemplate: "api/{apiVersion}/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute (
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
我原以为这个路由会使“v1”成为可选的,所以上面的派生文档不是预期的。
(边栏:转到 api/products
肯定行不通,所以我不确定这有什么问题。我错过了什么?)
看来真正的问题是 Web API 帮助页面读取路由不正确,因为我认为 v1
和 {apiVersion}
不应该同时出现在同样的动作。 我在这里错过了什么?
尝试使用属性路由,安装 nuget 包
Install-Package Microsoft.AspNet.WebApi.WebHost
在 WebApiConfig.cs
中启用属性路由
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 }
);
}
}
然后在控制器的方法中使用属性 Route
[Route("~/api/v1/Products")]
[HttpGet]
public List<Product> Products()
{}
[Route("~/api/v2/Products")]
[HttpGet]
public List<Product> V2Products()
{}
在文档中您将获得
GET api/v1/Products - Gets all products
GET api/v2/Products - Gets all products
这似乎是 ASP.NET 网络 API 帮助页面的缺点。为了解决这个问题,我更改了视图以从呈现的文档中排除这些无效路由。对于上面的例子,我在ApiGroup.cshtml的循环中添加了这个Where子句,改变
@foreach (var api in Model){
至
@foreach (var api in Model.Where(m => !m.Route.RouteTemplate.Contains(@"{apiVersion}"))){
我在 Web API Help Page 中使用不同的 parents 重复呈现条目,例如这些引用相同方法的条目:
GET api/{apiVersion}/v1/Products - Gets all products
...
GET api/v1/Products - Gets all products
...
我有一个 Web API 页面,其中包含如下路由:
config.Routes.MapHttpRoute (
name: "DefaultVersionApi",
routeTemplate: "api/{apiVersion}/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute (
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
我原以为这个路由会使“v1”成为可选的,所以上面的派生文档不是预期的。
(边栏:转到 api/products
肯定行不通,所以我不确定这有什么问题。我错过了什么?)
看来真正的问题是 Web API 帮助页面读取路由不正确,因为我认为 v1
和 {apiVersion}
不应该同时出现在同样的动作。 我在这里错过了什么?
尝试使用属性路由,安装 nuget 包
Install-Package Microsoft.AspNet.WebApi.WebHost
在 WebApiConfig.cs
中启用属性路由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 }
);
}
}
然后在控制器的方法中使用属性 Route
[Route("~/api/v1/Products")]
[HttpGet]
public List<Product> Products()
{}
[Route("~/api/v2/Products")]
[HttpGet]
public List<Product> V2Products()
{}
在文档中您将获得
GET api/v1/Products - Gets all products
GET api/v2/Products - Gets all products
这似乎是 ASP.NET 网络 API 帮助页面的缺点。为了解决这个问题,我更改了视图以从呈现的文档中排除这些无效路由。对于上面的例子,我在ApiGroup.cshtml的循环中添加了这个Where子句,改变
@foreach (var api in Model){
至
@foreach (var api in Model.Where(m => !m.Route.RouteTemplate.Contains(@"{apiVersion}"))){