2012-07-11 84 views
1

我正在开发一个使用ASP.Net Web API的应用程序并配置应用程序路由,我遵循this方法。但在我的应用程序中,我想要的网址如下所示。 “http:// localhost/MY/api/user/AllGridData/false/1342006446883/10/1/Id/desc”如何在ASP.Net中正确路由WebAPI

我在浏览器窗口中手动输入了这个URL,并且触发了AllGridData方法。但是当我从应用程序访问它时,它会尝试像下面那样访问URL。 “HTTP://本地主机/ MY/API /用户/ AllGridData _search =假& ND = 1342006446883个&行= 10 &页= 1 & SIDX =编号& SORD = desc” 的

所以那么AllGridData方法是由于以下例外情况未被解雇。 无法加载资源:服务器响应状态为400(错误请求)“http:// localhost/MY/api/user/AllGridData?_search = false & nd = 1342006446883 & rows = 10 & page = 1 & sidx = Id & sord = desc“

我在RouterConfig.cs中为此URL进行路由就是这样的。

routes.MapHttpRoute(
      name: "LoadGridApi", 
      routeTemplate: "api/{controller}/{action}/{_search}/{nd}/{rows}/{page}/{sidx}/{sord}", 
      defaults: new { _search = UrlParameter.Optional, nd = UrlParameter.Optional, rows = UrlParameter.Optional, page = UrlParameter.Optional, sidx = UrlParameter.Optional, sord = UrlParameter.Optional } 
     ); 

希望你明白这个问题。最终我想要的是像下面的URL,所以然后它的AllGridData方法被激发。 “http:// localhost/MY/api/user/AllGridData/false/1342006446883/10/1/Id/desc”

我在做什么错?是否因为路由代码错误?

我的AllGridData方法位于WebAPI控制器中,不在MVC控制器中。

回答

2

thilok。我只是尝试了一些类似的东西,用一个更简单的路由。

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

并使用jQuery getJson调用来调用以下方法。

public IEnumerable<Organisation> Get(int id, int nd) 
     {       
      using (_unitOfWork) 
      { 

我发现我是能够使使用所有的以下网址

/API /组织/ 2/3,/ API /组织/ 2次= 3/API/userorganisations /电话?id = 2 & nd = 3

这也适用于直接从浏览器窗口调用它们。 (铬)。

我注意到,你有错误的是你有一个额外的行动{action}占位符。这不应该在WebApi路由中。这仅适用于MVC路由。 WebApi的行为没有任何概念,因为这全部由HttpVerbs处理。

进一步的信息可以在这里找到

WebApi routing

1

您可以使用行动刚刚在的WebAPI太细。如果您正在尝试构建RESTful,那么您就不需要它们。

例如:

public HttpResponseMessage OpenBill(long billId) 

获取它从路线:

routes.MapHttpRoute(
name: "DefaultApiWithActionAndId", 
routeTemplate: "api/{controller}/{action}/{id}", 
defaults: new { id = RouteParameter.Optional } 
); 

而且,你不必与一个以上的路线specifiy查询字符串。这就是为什么/ api/organizations/2/3工作和/ 2?nd = 3工作。

恕我直言,你应该尽量保持路线尽可能简单,否则你是在一个世界受到伤害,如果一些东西停止工作,你必须调试你的路线。所以我会去querystring版本。

为什么你会得到一个查询字符串,我无法回答。这取决于谁在制作网址。这就是GET通常如何完成的。