1

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

我在浏览器窗口中手动输入了这个 url,AllGridData 方法被触发了。但是当我从应用程序访问它时,它会尝试访问如下所示的 url。“http://localhost/MY/api/user/AllGridData?_search=false&nd=1342006446883&rows=10&page=1&sidx=Id&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 控制器中。

4

2 回答 2

2

蒂洛克。我只是尝试了类似的东西,但路由更简单。

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)
            {

我发现我可以使用以下所有 Url 拨打电话

/api/organisations/2/3、/api/organisations/2?nd = 3 和 /api/userorganisations/?id=2&nd=3

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

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

更多信息可以在这里找到

WebApi 路由

于 2012-07-11T12:07:00.923 回答
1

您也可以在 WebApi 中很好地使用操作。如果你正在尝试构建 RESTful 的东西,你只是不需要它们。

例子:

public HttpResponseMessage OpenBill(long billId)

从以下位置获取路线:

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

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

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

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

于 2012-10-04T12:55:12.280 回答