【问题标题】:Routing for HTTP Get without arguments doesn't work (web.api)不带参数的 HTTP Get 路由不起作用 (web.api)
【发布时间】:2017-08-16 08:19:51
【问题描述】:

特殊情况,我有这个方法

    [HttpGet]
    [Route("api/models/getallmachines")]
    public IHttpActionResult GetAllMachines()
    {
        var model= db.machine.ToList();
        return Ok(model);
    }

而且我总是在调用http://localhost:xxx/api/models/getallmachines 时发现找不到资源。但是如果我添加一个论点,说

    [HttpGet]
    [Route("api/models/getallmachines/{blub}")]
    public IHttpActionResult GetAllMachines(int blub)
    {
        var model= db.machine.ToList();
        return Ok(model);
    }

它适用于http://localhost:xxx/api/models/getallmachines/0!为什么?这是我的 webapiconfig

    public static void Register(HttpConfiguration config)
    {
        config.MapHttpAttributeRoutes();

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

        var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml");
        config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);
    }

更新

在浏览器中使用路由调试器我得到

同一个控制器里还有另外一种方法,这里是这个

    [HttpGet]
    [Route("api/models/getmodel/{id}")]
    public IHttpActionResult GetModel(int id)
    {
        var model = models.FirstOrDefault(p => p.ApiModelId == id);
        if (model == null)
            return NotFound();
        return Ok(model);
    }

这给了我浏览器中的 json 文件和这个路由调试器信息

【问题讨论】:

  • 如果将 routeTemplate 更改为:“api/{controller}/{action}/{id}”会发生什么。然后 getallmachines 将被映射为操作。我怀疑它现在可能被解释为 id (也许)。
  • 不,不是这样,很遗憾
  • 控制器类上的属性 RoutePrefix("api/models") 和方法上的属性 Route("getallmachines") 会发生什么
  • 同样的问题,不起作用
  • 结果码404或403是什么?

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


【解决方案1】:

我认为您可以在 RouteConfig 中添加新路由。

       `config.Routes.MapHttpRoute(
            name: "DefaultApiWithoutId",
            routeTemplate: "api/{controller}/{action}/",
            defaults: null
        );`

这条路线应该放在第一条路线之后(因为它的限制较少)。这是一个不错的包的描述,它可以更容易地检查,选择了哪些路线以及为什么:Route Debugger。

注意:在发布某些内容之前,您必须卸载/禁用 routedebugger。可能会导致烦人的问题...

【讨论】:

  • 没有用,但请查看更新后的问题以获取有关路由调试器的更多信息。
  • 您的错误页面似乎包含部分问题:ASP 将您的控制器映射到 api,将您的操作映射到模型,并将您的 id 映射到 getAllMachines。正如我看到您的问题,这不是预期的行为。我建议您首先尝试将您的网址与您的预期结果完全匹配...
  • 还有一件事:路由调试器列出了来自 ASP 的调用排序的匹配路由。路线的顺序很重要!!!您应该在带有 Id 的路由之前添加上述路由...
  • 我发现了问题,非常愚蠢,但是您对before的评论给了我正确的提示,谢谢。
【解决方案2】:

问题是 - 通常 - 非常愚蠢......我忘了提到,我正在使用 web.api 以及 regular mvc。在Global.asax.cs中,首先初始化mvc路由,然后是web.api的路由,即

        RouteConfig.RegisterRoutes(RouteTable.Routes);
        GlobalConfiguration.Configure(WebApiConfig.Register);

而不是

        GlobalConfiguration.Configure(WebApiConfig.Register);
        RouteConfig.RegisterRoutes(RouteTable.Routes);

这导致模式api/models/whatever与mvc中的默认路由配置匹配,即

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );

所以更改Global.asax.cs 中的调用顺序解决了这个问题。谢谢@Joshit

【讨论】:

  • 太棒了!很高兴我能提供帮助:) 亲切的问候
猜你喜欢
  • 1970-01-01
  • 2015-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-21
  • 2016-05-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多