3

我可以将多个变量传递给[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:[端口]/api/[控制器]/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:[端口]/api/[控制器]/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);但没有 Area 路线以 . 开头api。我对此 ApiController 的所有其他测试都可以毫无问题地进入操作。

4

4 回答 4

1

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

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

来自维基百科

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

所以你需要在你的命令&中用反冲来逃避&符号\

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

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

curl "http://localhost:[port]/api/[controller]/GetAll?page=3&sortOrder=Name"
于 2012-08-29T20:48:23.083 回答
0

尝试注册您的路线HttpRouteCollection

于 2012-08-29T20:22:39.693 回答
0

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

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

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

于 2012-08-29T13:32:24.210 回答
-2

在您的示例中:

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

这永远不会奏效,你不能得到一个模型,它必须是 POST/PUTed。

于 2012-08-29T20:31:20.257 回答