Asp.net web api ASP.NET WebAPI路由将我与空参数混淆

Asp.net web api ASP.NET WebAPI路由将我与空参数混淆,asp.net-web-api,Asp.net Web Api,我不明白为什么我需要创建一个空的方法签名来允许带有3个空参数的Get-rest调用工作。我有以下代码: public class SessionPresenterController : ApiController { public HttpResponseMessage Get() { return Get(null, null, null); } public HttpResponseMessage Get(int? codeCampYea

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

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


    public HttpResponseMessage Get(int? codeCampYearId, int? sessionId, int? attendeesId)
    {
在我的网站上我有

        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,则找不到具有三个null参数的Get


为什么不呢?

尝试为参数指定默认值:

public HttpResponseMessage Get(
    int? codeCampYearId = null, 
    int? sessionId = null, 
    int? attendeesId = null)
{
    //...
}

尝试为参数指定默认值:

public HttpResponseMessage Get(
    int? codeCampYearId = null, 
    int? sessionId = null, 
    int? attendeesId = null)
{
    //...
}

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

有一个完整的文档。让我们使用一些extratc并揭示发生了什么:

动作选择

创建控制器上与HTTP请求方法匹配的所有操作的列表。 如果路由字典具有操作条目,请删除名称与此值不匹配的操作。 尝试将操作参数与URI匹配,如下所示: 对于每个操作,获取一个简单类型的参数列表,其中绑定从URI获取参数。排除可选参数。 从该列表中,尝试在路由字典或URI查询字符串中查找每个参数名称的匹配项。匹配项不区分大小写,不依赖于参数顺序。 选择一个操作,其中列表中的每个参数在URI中都有匹配项。 如果有多个操作符合这些条件,请选择参数匹配最多的操作。 换句话说,如果只有忽略了三个参数的Get,则决定应选择哪个操作:

选择的是Getint?codeCampYearId,int?sessionId,int?与会者席德 还是Getint?codeCampYearId,int?sessionId,int?已选择Attendesid URL为/rest/SessionPresenter 没有排除可选参数。所有这些都必须找到 URL不匹配所有三个参数 所以要解决这个问题,我们必须将所有参数传递为空,null:

/rest/SessionPresenter?codeCampYearId&attendeesId&sessionid

或者将签名更改为具有参数optinal Jacobs's answer,并在操作选择过程中跳过该选项将解决您的问题。让我们来回答这个问题为什么不呢?为什么找不到get

有一个完整的文档。让我们使用一些extratc并揭示发生了什么:

动作选择

创建控制器上与HTTP请求方法匹配的所有操作的列表。 如果路由字典具有操作条目,请删除名称与此值不匹配的操作。 尝试将操作参数与URI匹配,如下所示: 对于每个操作,获取一个简单类型的参数列表,其中绑定从URI获取参数。排除可选参数。 从该列表中,尝试在路由字典或URI查询字符串中查找每个参数名称的匹配项。匹配项不区分大小写,不依赖于参数顺序。 选择一个操作,其中列表中的每个参数在URI中都有匹配项。 如果有多个操作符合这些条件,请选择参数匹配最多的操作。 换句话说,如果只有忽略了三个参数的Get,则决定应选择哪个操作:

选择的是Getint?codeCampYearId,int?sessionId,int?与会者席德 还是Getint?codeCampYearId,int?sessionId,int?已选择Attendesid URL为/rest/SessionPresenter 没有排除可选参数。所有这些都必须找到 URL不匹配所有三个参数 所以要解决这个问题,我们必须将所有参数传递为空,null:

/rest/SessionPresenter?codeCampYearId&attendeesId&sessionid

或者将签名更改为具有参数optinal Jacobs's answer,并在操作选择过程中跳过该参数

正确答案。。但是文档中说,对于每个操作,获取一个简单类型的参数列表…简单类型包括所有.NET Framework基本类型,加上DateTime、Decimal、Guid、String和TimeSpan。。那么,为什么是int?是否已添加到参数列表中?回答得好。。但是文档中说,对于每个操作,获取一个简单类型的参数列表…简单类型包括所有.NET Framework基本类型,加上DateTime、Decimal、Guid、String和TimeSpan。。那么,为什么是int?是否已添加到参数列表中?