2017-08-16 104 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