【问题标题】:How to do the proper routing in ASP.Net WebAPI如何在 ASP.Net WebAPI 中进行正确的路由
【发布时间】:2012-07-11 11:46:37
【问题描述】:

我正在使用 ASP.Net Web API 开发应用程序并配置应用程序路由,我遵循this 方法。但在我的应用程序中,我想要的网址如下。 "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 控制器中。

【问题讨论】:

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


    【解决方案1】:

    提洛。我刚刚尝试了类似的方法,但路由更简单。

    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 routing

    【讨论】:

      【解决方案2】:

      您也可以在 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 通常的完成方式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-12
        • 2016-07-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-09
        • 2020-12-23
        • 2019-09-15
        相关资源
        最近更新 更多