如何在ASP.Net WebAPI中进行正确的路由

时间:2012-07-11 11:46:38

标签: asp.net asp.net-web-api asp.net-routing

我正在使用ASP.Net Web API开发应用程序并配置应用程序路由,我正在遵循this方法。但在我的应用程序中,我想要的网址如下。的 “http://本地主机/ MY / API /用户/ AllGridData /假/10分之1342006446883/ 1 / ID / desc” 的

我在浏览器窗口中手动输入了此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://本地主机/ MY / API /用户/ AllGridData /假/10分之1342006446883/ 1 / ID / desc” 的

我做错了什么?是因为错误的路由代码吗?

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

2 个答案:

答案 0 :(得分: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 / organizations / 2/3,/ api / organizations / 2?nd = 3 and / api / userorganisations /?id = 2&amp; nd = 3

当从浏览器窗口直接调用它们时,这也有效。 (铬)。

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

可在此处找到更多信息

WebApi routing

答案 1 :(得分:1)

您也可以在WebApi中正常使用操作。如果你正在尝试构建一些RESTful的东西,你就不需要它们。

示例:

public HttpResponseMessage OpenBill(long billId)

从以下路线获取路线:

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

此外,您不必指定具有多个路由的查询字符串。这就是为什么/ api / organizations / 2/3有效,/ 2?nd = 3有效。

恕我直言,你应该尽量保持路线尽可能简单,否则,如果某些东西停止工作并且你必须调试路线,你就会陷入伤害的世界。所以我会选择querystring版本。

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