没有参数的HTTP Get路由不起作用(web.api)

时间:2017-08-16 08:19:51

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

奇特的情况,我有这个方法

    [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);
    }

更新

在浏览器中使用路由调试器,我得到see image below

在同一个控制器中有另一种方法,这个方法在这里

    [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文件和这个路由调试器信息

enter image description here

2 个答案:

答案 0 :(得分:1)

我认为您可以为RouteConfig添加新路线。

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

此路线应放在第一条路线之后(因为它的限制性较小)。下面是一个很好的包的描述,它可以更容易检查,采取哪些路由以及原因:Route Debugger

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

答案 1 :(得分:0)

问题是 - 经常 - 非常愚蠢...我忘了提及,我正在使用web.api以及常规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