Маршрутизация в жестком коде контроллера 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", это решило проблему, и теперь оно работает.

Другие вопросы по тегам