У меня есть маршруты, настроенные следующим образом:
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
Я считаю, что это проблема в 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 }
);
И это работает!
для api/{controller}/{action}/{id} URL маршрута api/подпрограмма /5 поиск функции (действия) 5, которой нет
Обновить:
в вашем сообщении об ошибке есть причина, по которой он не работает: необязательный параметр должен быть ссылочным типом, нулевым типом или быть объявлен как необязательный параметр. "}
int не имеет значения NULL, поэтому, когда вы не укажете его значение, он не сможет создать идентификатор.
используемая маршрутизация на основе конвенций (установка пакета nuget)
добавьте определенный следующий маршрут типа на свой веб-сайт api
[Route("api/routine/{id}")]