【问题标题】:How can an ApiController accept multiple variables?ApiController 如何接受多个变量?
【发布时间】:2012-08-29 13:17:07
【问题描述】:

我可以将多个变量传递给[HttpGet] ApiController 操作吗?例如:

[HttpGet]
public IPagedList<Something> GetAll(int? page, string sortOrder="")
{
...
}

我用

测试过
curl http://localhost:[port]/api/[controller]/GetAll?page=3&sortOrder=Name

但从未调用过该操作。返回消息是:未找到与请求 URI 匹配的 HTTP 资源。出了什么问题?

---更新---

如果我检查 HttpActionContext.Request.RequestUri.Query 中的查询字符串,AbsoluteUri 在 & 符号处被截断,只给我page=3

---更新结束

我也试过一个变量:

[HttpGet]
public IPagedList<Something> GetAll(int? page)
{
...
}

测试中可以毫无问题地到达里面的断点

curl http://localhost:[port]/api/[controller]/GetAll?page=3

我还创建了一个视图模型:

public class ListRequestModel
{
    public string SortOrder { get; set; }
    public string CurrentFilter { get; set; }
    public string SearchString { get; set; }
    public int PageNumber { get; set; }
}

动作是这样的:

[HttpGet]
public IPagedList<Something> GetAll(ListRequestModel model)
{
...
}

然后测试

curl http://localhost:[port]/api/[controller]/GetAll?PageNumber=3&SortOrder=Name

这一次,可以达到里面的断点,这是一件了不起的事情。但模型为空,未填充查询字符串中的数据。

那么,将多个变量传递给动作方法的正确方法是什么?请帮忙。谢谢。

---------更新-----------

根据要求,下面粘贴的是RouteConfig.cs 文件中的路由表:

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

Global.asax.cs 中,AreaRegistration.RegisterAllAreas();RouteConfig.RegisterRoutes(RouteTable.Routes); 之前,但没有区域路线以api 开头。我在这个 ApiController 上的所有其他测试都可以毫无问题地进入操作。

【问题讨论】:

  • RegisterAllAreas、RegisterRoutes、Configure 和 RegisterGlobalFilters。你怀疑我们的路由表吗?
  • @Blaise 是的,请发布您的路由表。

标签: asp.net-mvc curl asp.net-web-api


【解决方案1】:

您的路由和设置很好。当然,您可以将多个参数传递给控制器​​。

您只需要改进您的 Linux foo,因为 &amp; 在 Linux shell 中具有特殊含义...

来自Wikipedia

  • 一些 Unix shell 使用 & 作为元字符:
  • 一些 Unix shell,如 POSIX 标准 sh shell,使用 & 号在后台执行进程并复制文件 描述符。
  • 在 Bash 中,& 符号可以分隔单词、控制命令历史记录、复制文件描述符、执行逻辑操作、 控制作业,并参与正则表达式。

因此,您需要在命令中使用反冲符号 \ 转义与符号 &amp;

curl http://localhost:[port]/api/[controller]/GetAll?page=3\&sortOrder=Name

或者在url周围使用引号""

curl "http://localhost:[port]/api/[controller]/GetAll?page=3&sortOrder=Name"

【讨论】:

  • 试一试。哇!有用!非常感谢。我没有使用 Unix 机器。 \&amp; 方法失败。但是引号的作用就像一个魅力。
【解决方案2】:

如果您没有使用基于操作的路由,那么您做错了。请尝试以下操作:

curl http://localhost:[port]/api/[controller]?page=3&sortOrder=Name

另一方面,如果您在相同的上下文中运行 Web API 应用程序和 ASP.NET MVC,请确保在 MVC 路由之前注册您的 Web API 路由。否则,默认 MVC 路由将捕获您的所有 Web API 请求并很可能返回 404。

【讨论】:

  • 我用[HttpGet]来装饰动作。只需更新我的问题以反映这一点。我也在更新中发布了我的路由表。问题是,可以毫无问题地执行某些操作。只有我需要的有多个变量的有问题。
【解决方案3】:

也尝试针对HttpRouteCollection 注册您的路线。

【讨论】:

    【解决方案4】:

    在你的例子中:

    [HttpGet]
    public IPagedList<Something> GetAll(ListRequestModel model)
    {
    ...
    }
    

    这永远行不通,你不能 GET 模型,它必须是 POST/PUTed。

    【讨论】:

    • 我理解为什么其他人不赞成您的帖子。我们当然可以将 json 数据发送到 GET 操作。
    猜你喜欢
    • 1970-01-01
    • 2018-07-23
    • 1970-01-01
    • 2012-07-25
    • 2015-11-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    • 1970-01-01
    相关资源
    最近更新 更多