ASP.net web api 2错误"参数字典包含参数"的空条目
本文关键字:参数 quot 包含 字典 net 错误 api ASP web | 更新日期: 2023-09-27 18:03:57
我有这样的路由配置:
routes.MapHttpRoute("DefaultApi2", "api/{controller}/{action}/{id}", new {id = RouteParameter.Optional}
我的控制器是这样的:
public class RoutineController : ApiController
{
private readonly RoutineService _routineService;
public RoutineController(RoutineService routineService)
{
_routineService = routineService;
}
[HttpGet]
[ActionName("Tags")]
public List<RoutineTag> Tags()
{
return _routineService.GetAllTags();
}
[HttpGet]
[ActionName("SingleRoutine")]
// GET api/routine/5
public RoutineViewModel SingleRoutine(int id)
{
return _routineService.GetRoutineById(id);
}
}
但是我得到这个错误:
{"Message":"The request is invalid.","MessageDetail":"The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int32' for method 'Infrastructure.Api.Models.RoutineViewModel Routine(Int32)' in 'Infrastructure.Api.Controllers.RoutineController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter."}
如果我将SingleRoutine方法更改为:
[HttpGet]
[ActionName("SingleRoutine")]
// GET api/routine/5
public RoutineViewModel SingleRoutine(int? id)
{
if (!id.HasValue)
{
return null;
}
return _routineService.GetRoutineById((int) id);
}
在浏览器中我只看到"null"
为什么会这样?
编辑
当我输入/api/routine/tags
我相信这是WebApiConfig的问题,我有这些行:
config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}", new {id = RouteParameter.Optional}
);
config.Routes.MapHttpRoute("CustomApi", "{controller}/{action}/{id}", new {id = RouteParameter.Optional}
);
和Route Config
routes.MapHttpRoute("DefaultApi2", "api/{controller}/{action}/{id}", new {id = RouteParameter.Optional}
现在在WebApiConfig我有:
config.Routes.MapHttpRoute("CustomApi", "api/{controller}/{action}/{id}", new { id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}", new {id = RouteParameter.Optional}
);
And In RouteConfig:
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
它有效!
for api/{controller}/{action}/{id} route URL api/routine/5查找不存在的function (action) 5
更新:
你的错误消息有失败的原因:一个可选参数必须是一个引用类型,一个可空类型,或者被声明为一个可选参数。"}
int是不可空的,所以当你不提供它的值时,它无法创建id。
使用基于约定的路由(安装nuget包)
在你的web api中添加以下类型路由
[Route("api/routine/{id}")]