'参数字典包含一个空条目'错误,Web API

时间:2016-06-14 09:46:48

标签: c# asp.net-web-api asp.net-web-api2

在我的Web API上,我有一个文档控制器,它有两个简单的操作:

[AllowAnonymous]
public class DocumentController : ApiController
{    
    public String Get(int id)
    {
        return "test";
    }

    public String Get(string name)
    {
        return "test2";
    }
}

以下URL(执行第一个函数)工作正常:

  

http://localhost:1895/API/Document/5

但是这个URL(应该执行第二个函数):

  

http://localhost:1895/API/Document/test

引发此错误:

  

{     " message":"请求无效。",   " messageDetail":"参数字典包含参数' id'的空条目。非可空类型的System.Int32'方法' xx.yy.Document获取(Int32)'在' API.Controllers.DocumentController'。可选参数必须是引用类型,可空类型,或者声明为可选参数。"   }

这是WebApiConfig中的MapHttpRoute

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

我做错了什么?请指教。

1 个答案:

答案 0 :(得分:2)

您的第二个函数有一个参数name,默认参数名为id。使用当前设置,您可以访问

上的第二个功能
  

http://localhost:1895/API/Document/?name=test

要使网址按照您之前指定的方式运行,我建议您使用attribute routingroute constraints

启用属性路由:

config.MapHttpAttributeRoutes();

定义方法的路线:

[RoutePrefix("api/Document")]
public class DocumentController : ApiController
{    
    [Route("{id:int}")]
    [HttpGet]
    public String GetById(int id)   // The name of this function can be anything now
    {
        return "test";
    }

    [Route("{name}"]
    [HttpGet]
    public String GetByName(string name)
    {
        return "test2";
    }
}

在此示例中,GetById对路由({id:int})有约束,该约束指定参数必须是整数。 GetByName没有这样的约束,因此当参数不是整数时应匹配。