【问题标题】:Web API routing and a Web API Help Page: how to avoid repeated entriesWeb API 路由和 Web API 帮助页面:如何避免重复输入
【发布时间】:2015-02-25 21:48:15
【问题描述】:

我的Web API Help Page 中出现了重复的条目,这些条目具有不同的父级,例如这些引用相同的方法:

GET api/{apiVersion}/v1/Products - 获取所有产品

...

GET api/v1/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} 不应同时出现在同一个操作中我错过了什么?

【问题讨论】:

  • 我不认为它是重复的——我帖子中的第一个条目,正如它所显示的那样,似乎完全是错误的。根据我帖子底部的路由,任何具有该结构的 URL 都不起作用。

标签: asp.net-mvc-routing asp.net-web-api asp.net-web-api-helppages


【解决方案1】:

尝试使用属性路由,安装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 }
        );
    }
}

然后在你的Controller的方法中使用属性Route

[Route("~/api/v1/Products")]
[HttpGet]
public List<Product> Products()
{}

[Route("~/api/v2/Products")]
[HttpGet]
public List<Product> V2Products()
{}

在您将获得的文档中

GET api/v1/Products - 获取所有产品

GET api/v2/Products - 获取所有产品

【讨论】:

  • 或使用 Swashbuckle 生成帮助页面
  • 这应该可以,但我仍然很好奇为什么原始案例在帮助页面中给出了看似完全不正确的路由。
【解决方案2】:

这似乎是 ASP.NET Web API 帮助页面的一个缺点。作为解决方法,我更改了视图以从呈现的文档中排除这些无效路由。对于上面的例子,我在ApiGroup.cshtml的循环中加入了这个Where子句,改变了

@foreach (var api in Model){

@foreach (var api in Model.Where(m => !m.Route.RouteTemplate.Contains(@"{apiVersion}"))){

【讨论】:

    猜你喜欢
    • 2013-07-08
    • 1970-01-01
    • 2014-12-27
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-17
    相关资源
    最近更新 更多