2017-08-16 72 views
1

特殊情况,我有这样的方法路由的HTTP GET不带参数不起作用(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); 
    } 

UPDATE

在浏览器中使用的路线调试器,我得到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

+0

如果将routeTemplate更改为“api/{controller}/{action}/{id}”,会发生什么情况。然后getallmachines将被映射为动作。我怀疑它现在可能被解释为id(也许)。 – m4ttsson

+0

不,那不是它,可惜的是 – rst

+0

什么对你的控制器类的属性'RoutePrefix(“API /模型”)'和你的方法 – Troopers

回答

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

+0

太棒了!很高兴我能够帮助:)亲切的问候 – Joshit

1

我想你可以添加新的路由到您的RouteConfig。

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

此路线应放置在第一条路线之后(因为它的限制较少)。下面是一个很好的软件包的描述,这使得更容易检查,获取哪些路由以及为什么:Route Debugger

注:之前释放的东西,你必须卸载/禁用routedebugger ..可引起恼人的问题...

+0

没有工作,但查看更新的问题以获取更多关于路由调试器的信息。 – rst

+0

您的错误页面似乎包含部分问题:ASP将您的控制器映射到api,您的动作模型和您的id到getAllMachines。正如我看到你的问题,这不是预期的行为..我建议,你首先尝试匹配您的网址到您的预期结果... – Joshit

+2

还有一件事:路由调试器列出匹配的路由命令来自ASP的呼叫。路线的顺序很重要!你应该添加上面的路线之前的路线与Id ... – Joshit