在我的Web API上,我有一个文档控制器,它有两个简单的操作:
[AllowAnonymous]
public class DocumentController : ApiController
{
public String Get(int id)
{
return "test";
}
public String Get(string name)
{
return "test2";
}
}
以下URL(执行第一个函数)工作正常:
但是这个URL(应该执行第二个函数):
引发此错误:
{ " 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 }
);
我做错了什么?请指教。
答案 0 :(得分:2)
您的第二个函数有一个参数name
,默认参数名为id
。使用当前设置,您可以访问
要使网址按照您之前指定的方式运行,我建议您使用attribute routing和route 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
没有这样的约束,因此当参数不是整数时应匹配。