@thekip
Php/C#/Js Developer

Почему не запускаются MVC Controllers в Web API приложении?

Изучаю ASP.net MVC Framework.
Создал приложение из шаблонв Web Api (именно API меня сейчас инетересует) по туториалу с Microsoft .
Сейчас пытаюсь добавить в него стандартные MVC контроллеры и ничего не выходит.

Я создал класс HomeController унаследованный от Controller и положил его в папку Controllers.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Http;

namespace StopSalesApi.Controllers
{
    public class HomeController : Controller
    {
        //
        // GET: /Home/
        public String Index()
        {
            return "HelloWorld";
        }
	}
}
Предварительно добавил в коллекцию роутингов, маршрут для не Api контроллеров.
public static void Register(HttpConfiguration config)
        {
            // Web API routes
            config.MapHttpAttributeRoutes();

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

         // MVC routes
            config.Routes.MapHttpRoute(
                name: "Default",
                routeTemplate: "{controller}/{action}",
                defaults: new {controller = "Home", action = "Index"}
            );
        }
Но MVC Framework на отрез отказывается видеть мой контроллер Home. Другие контроллеры, которые унаследованы от ApiController, запускаются, а потомки Controller - нет.
Выдает ошибку json'om
{"Message":"Не удалось найти ресурс HTTP, соответствующий URI запроса \"http://localhost:9707/\".","MessageDetail":"Не удалось найти тип, соответствующий контроллеру \"Home\"."}
При этом стоит изменить родительский класс у типа Home на ApiController и фрэймворк начинает его видеть.

Я уже создал из шаблонов в VS, полноценное MVC приложение и проверил в чем отличия, скопировал список пакетов в свой проект, но ничего не изменилось.

Никак не могу понять какая именно настройка отвечает за поиск контроллеров?
  • Вопрос задан
  • 6020 просмотров
Решения вопроса 1
@thekip Автор вопроса
Php/C#/Js Developer
Всё. Осилил наконец.
Кроме того что необходимо использовать RouteTable.Routes вместо GlobalConfiguration.Configuration.Routes, необходимо так же использовать метод MapRoute() вместо MapHttpRoute().

namespace StopSalesApi
{
    public class WebApiApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            RouteTable.Routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}",
                defaults: new { controller = "Home", action = "Index" });

            GlobalConfiguration.Configure(WebApiConfig.Register);
        }
    }
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Sequd
MVC контроллеры нужно добавлять в RouteTable.Routes (RouteTable.RouteCollection) , а не в GlobalConfiguration.Configuration.Routes (HttpConfiguration.HttpRouteCollection). Это разные роуты.
А вот там уже будет
MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы