【问题标题】:WebApi 2 Route Attribute not working unless using parameter除非使用参数,否则 WebApi 2 路由属性不起作用
【发布时间】:2015-07-06 17:50:53
【问题描述】:

我有一个控制器列表

[Route("api/cache/list")]
[HttpGet]
public IEnumerable<string> List()
{
   ...
}

但是如果我尝试访问 localhost:12121/api/cache/list,我会得到 404。我的 webapi 配置如下所示:

public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services
            // Configure Web API to use only bearer token authentication.
            //config.SuppressDefaultHostAuthentication();
            //config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

            // Web API routes
            config.MapHttpAttributeRoutes();
            config.Formatters.Remove(config.Formatters.XmlFormatter);

            //config.Routes.MapHttpRoute(
            //    name: "DefaultApi",
            //    routeTemplate: "api/{controller}/{id}",
            //    defaults: new { id = RouteParameter.Optional }
            //);
        }
    }

另一方面,如果我将该控制器更改为

[Route("api/cache/list/{id}")]
[HttpGet]
public IEnumerable<string> List(int id =0)
{
   ...
}

它会起作用的。我试过在没有 id 作为参数的情况下这样做,仍然没有工作。我在这里做错了什么?

额外信息:

我确实有一个奇怪的设置。我的 WebApiConfig.cs 和 global.cs 在不同的项目中。然后,拥有我的控制器的项目将使用 WebApiConfig.cs 引用该项目

【问题讨论】:

  • 不确定是否可以在没有 id 参数的情况下调用该方法
  • 可选但不可忽略
  • 好吧,如果你看看这个:asp.net/web-api/overview/web-api-routing-and-actions/… 你可以看到他们使用的路线没有 id。
  • 我也愿意添加 /{id} 但是当我转到那个 url 时它需要一个 id 或者它返回 404
  • 在这种情况下,从你的 get 中删除参数

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


【解决方案1】:

不要给参数一个默认值,试着让你的 id 参数可以为空:

public IEnumerable<string> List(int? id)

然后检查代码中的空值。这也有助于区分传递的零和省略的参数值。

【讨论】:

【解决方案2】:

我无法弄清楚如何准确解决问题,但我确实找到了解决问题的方法。

首先,我正确地确定了当我的路由位于单个程序集中时,完全相同的代码可以正常工作。当我的项目在不同程序集中的路由使config.MapHttpAttributeRoutes(); 难以正确识别属性路由时。

另一方面,使用RoutePrefix 似乎解决了我的问题。

我不会将此作为我的答案,因为我觉得它并不能真正解决问题,但我觉得它对任何提出这个问题的人来说都是有用的。

【讨论】:

    猜你喜欢
    • 2014-03-25
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 2017-04-09
    • 1970-01-01
    • 1970-01-01
    • 2021-06-10
    • 2016-01-26
    相关资源
    最近更新 更多