ASP.net web api 2错误"参数字典包含参数的空条目"

hyp*_*erN 1 c# asp.net asp.net-web-api asp.net-web-api2

我有像这样配置的路由:

   routes.MapHttpRoute("DefaultApi2", "api/{controller}/{action}/{id}", new {id = RouteParameter.Optional}
Run Code Online (Sandbox Code Playgroud)

我的控制器看起来像这样:

  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);

    }
}
Run Code Online (Sandbox Code Playgroud)

但是我收到了这个错误:

{"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."}
Run Code Online (Sandbox Code Playgroud)

如果我将方法SingleRoutine更改为:

    [HttpGet]
    [ActionName("SingleRoutine")]
    // GET api/routine/5
    public RoutineViewModel SingleRoutine(int? id)
    {
        if (!id.HasValue)
        {
            return null;
        }
        return _routineService.GetRoutineById((int) id);
}
Run Code Online (Sandbox Code Playgroud)

在浏览器中我只看到"null".

为什么会这样?

编辑

键入/ api/routine/tags时会显示此错误

hyp*_*erN 5

我相信这是WebApiConfig中的问题我有以下几行:

config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}", new {id = RouteParameter.Optional}
            );

        config.Routes.MapHttpRoute("CustomApi", "{controller}/{action}/{id}", new {id = RouteParameter.Optional}
            );
Run Code Online (Sandbox Code Playgroud)

并在Route Config中

 routes.MapHttpRoute("DefaultApi2", "api/{controller}/{action}/{id}", new {id = RouteParameter.Optional}
Run Code Online (Sandbox Code Playgroud)

现在在WebApiConfig我有:

 config.Routes.MapHttpRoute("CustomApi", "api/{controller}/{action}/{id}", new { id = RouteParameter.Optional }
         );
        config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}", new {id = RouteParameter.Optional}
            );
Run Code Online (Sandbox Code Playgroud)

在RouteConfig中:

  routes.MapRoute(
             name: "Default",
             url: "{controller}/{action}/{id}",
             defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
         );
Run Code Online (Sandbox Code Playgroud)

它的工作原理!

  • @Guanxi但这是解决方案,现在它有效,我为什么要把它放在问题中? (2认同)