ASP.net web api 2 error «Словарь параметров содержит пустую запись для параметра»

1

У меня есть маршруты, настроенные следующим образом:

   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/procedure/tags

Теги:
asp.net-web-api
asp.net-web-api2

3 ответа

5
Лучший ответ

Я считаю, что это проблема в 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}
            );

И в RouteConfig:

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

И это работает!

  • 1
    Пожалуйста, включите это в обновление для вашего вопроса. Всю эту информацию вы должны были предоставить вместе со своим вопросом.
  • 2
    @Guanxi Но это решение, теперь оно работает, почему я должен поставить его под вопрос?
1

для api/{controller}/{action}/{id} URL маршрута api/подпрограмма /5 поиск функции (действия) 5, которой нет

Обновить:

в вашем сообщении об ошибке есть причина, по которой он не работает: необязательный параметр должен быть ссылочным типом, нулевым типом или быть объявлен как необязательный параметр. "}

int не имеет значения NULL, поэтому, когда вы не укажете его значение, он не сможет создать идентификатор.

  • 0
    Я отредактировал свой вопрос, проблема возникает, когда я пытаюсь перейти на маршрут api / рутина / теги
  • 0
    Я также обновил свой ответ.
Показать ещё 5 комментариев
1

используемая маршрутизация на основе конвенций (установка пакета nuget)

добавьте определенный следующий маршрут типа на свой веб-сайт api

[Route("api/routine/{id}")]

Ещё вопросы

Сообщество Overcoder
Наверх
Меню