1

我不知道为什么我需要创建一个空的方法签名来允许带有 3 个空参数的 Get rest 调用工作。我有以下代码:

public class SessionPresenterController : ApiController
{
    public HttpResponseMessage Get()
    {
        return Get(null, null, null);
    }


    public HttpResponseMessage Get(int? codeCampYearId, int? sessionId, int? attendeesId)
    {

在我的 WebApiConfig 我有

        config.Routes.MapHttpRoute
           ("API Default Rest", "rest/{controller}/{id}",
            new { id = RouteParameter.Optional });

        config.Routes.MapHttpRoute
          ("API Default RPC", "rpc/{controller}/{action}/{id}",
           new { id = RouteParameter.Optional });

如果我在没有任何参数的情况下调用 /rest/SessionPresenter 并且没有定义 Get(),则找不到具有三个空参数的 Get。

为什么不?

4

2 回答 2

3

尝试为您的参数指定默认值:

public HttpResponseMessage Get(
    int? codeCampYearId = null, 
    int? sessionId = null, 
    int? attendeesId = null)
{
    //...
}
于 2013-06-02T03:58:52.533 回答
3

Jacobs 的片段将解决您的问题。让我们回答为什么不呢?为什么找不到get..

路由和操作选择有完整的文档。让我们使用一些提取器并揭示会发生什么:

动作选择

  1. 在控制器上创建与 HTTP 请求方法匹配的所有操作的列表。
  2. 如果路由字典有一个“动作”条目,则删除名称与该值不匹配的动作。
  3. 尝试将操作参数与 URI 匹配,如下所示:
    • 对于每个操作,获取简单类型的参数列表,其中绑定从 URI 获取参数。排除可选参数。
    • 从此列表中,尝试在路由字典或 URI 查询字符串中查找每个参数名称的匹配项。匹配不区分大小写,并且不依赖于参数顺序。
    • 选择列表中的每个参数在 URI 中都有匹配项的操作。
    • 如果多个操作满足这些条件,则选择参数匹配最多的操作。

换句话说,如果只有三个参数的Get(省略Get()),来决定应该选择哪个动作:

  1. 选择的是Get(int? codeCampYearId, int? sessionId, int? attendeesId)
  2. 仍然Get(int? codeCampYearId, int? sessionId, int? attendeesId)被选中
  3. 网址是/rest/SessionPresenter
    • 不排除可选参数。都必须找到
    • URL 不匹配所有三个参数

所以要解决它,我们必须传递所有参数(空,空):

/rest/SessionPresenter?codeCampYearId&attendeesId&sessionid

或者将签名更改为具有可选参数(Jacobs 的回答),并在动作选择期间跳过

于 2013-06-02T06:25:34.677 回答