Маршрутизация в жестком коде контроллера WebApi
Я пытаюсь написать собственный сервер WebAPI. Я хочу, чтобы все маршруты шли на один контроллер. Этот контроллер может выбрать часть URL-адреса контроллера и использовать ее для определения соответствующего ответа.
У меня есть следующая конфигурация маршрута:
_configuration.Routes.MapHttpRoute
(
name: "DefaultApi",
routeTemplate: string.Concat("api/Home", "/{id}"),
defaults: new { id = RouteParameter.Optional, controllerName="Home" }
);
Мой класс контроллеров называется "HomeController". Я пытаюсь перенаправить все URL на него.
Вот код для HomeController. А пока я закомментировал вызовы внешней логики (удаленного контроллера). Он должен просто возвращать строку в действии Get.
public class HomeController : ApiController
{
private IExternalController<string> remoteController;
public HomeController()
{
remoteController = GlobalKernelConfiguration.GetStandardKernel().Get<IExternalController<string>>();
}
public string Get()
{
return "HELLO FROM INTERNAL"; //remoteController.Get();
}
public string Get(int id)
{
return remoteController.Get(id);
}
public void Delete(int id)
{
remoteController.Delete(id);
}
public void Post(string value)
{
remoteController.Post(value);
}
public void Put(int id, string value)
{
remoteController.Put(id, value);
}
}
Я ожидал бы, что http://localhost:9000/api/[AnythingHere] направит на домашний контроллер, но я получаю следующую ошибку при попытке следующего URL: http://localhost:9000/api/Home
{"Message": "Не найден ресурс HTTP, соответствующий URI запроса" http://loca/ lhost: 9000 / api / Home ".","MessageDetail":"Не найдено ни одного маршрута, предоставляющего имя контроллера, соответствующего URI запроса ' http://localhost:9000/api/Home' "}
1 ответ
Как подсказал @CodeCaster в комментариях, проблема была вызвана тем, что в настройках маршрутизации не использовался правильный параметр.
Это то, что у меня было раньше
_configuration.Routes.MapHttpRoute
(
name: "DefaultApi",
routeTemplate: string.Concat("api/Home", "/{id}"),
defaults: new { id = RouteParameter.Optional, controllerName="Home" }
);
вот что у меня сейчас:
public static void AddControllerRoute(string controllerName)
{
_configuration.Routes.MapHttpRoute
(
name: "DefaultApi",
routeTemplate: string.Concat("api/Home", "/{id}"),
defaults: new { id = RouteParameter.Optional, controller ="Home" }
);
}
обратите внимание, что параметр по умолчанию был изменен и теперь использует "controller" вместо "controllerName", это решило проблему, и теперь оно работает.