Игнорирование маршрута приема всей почты приложения ASP.NET MVC5

Я разрабатываю спа-центр Angular 2, который будет размещен в приложении ASP.NET MVC 5. Я хочу, чтобы КАЖДЫЙ запрос шел по одному маршруту - / home / index - поэтому я удалил маршрут по умолчанию и заменил его универсальным:

routes.MapRoute(
  name: "spa-catch-all",
  url: "{*anything}",
  defaults: new { controller = "Home", action = "Index" });

Это ЕДИНСТВЕННЫЙ маршрут в файле RouteConfig.cs.

Если я попаду в свое приложение без каких-либо значений пути после URL-адреса сервера, например:

http://myserver.org/

Дальше все работает. Если я попытаюсь попасть по URL-адресу, подобному этому:

http://myserver.org/sectionname

Приложение возвращает ошибку 404.

Я установил NuGet-пакет Route Debugger Фила Хаака, чтобы попытаться диагностировать это, и отладчик сообщает мне, что маршрут по умолчанию asp.net, который я удалил, соответствует моему URL-адресу. Фактически, я даже не вижу всеобъемлющего маршрута, по крайней мере, не в том виде, в котором я его определил (он показывает {* catchall} вместо {* something}) в таблице «Все маршруты», созданной отладчиком.

MVC, похоже, игнорирует мой файл RouteConfig.

  • Есть идеи, что происходит?
  • Я не думал, что маршрут по умолчанию был определен где-либо за пределами самого веб-приложения. Мне нужно очистить таблицу маршрутов?
  • Могло ли что-то быть кэшировано где-то из одной из моих ранних сборок до того, как я внесу изменения в свой RouteConfig?

Обновление 1:

Вот полный файл RouteConfig.cs: public static void RegisterRoutes (RouteCollection routes)

namespace MyAppNamespace
{
    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                name: "spa-catch-all",
                url: "{*anything}",
                defaults: new { controller = "Home", action = "Index" });
        }
    }
}

Я должен отметить следующее.

  • Этот проект работает под ASP.NET 4.6.1
  • В этом проекте НЕТ АУТЕНТИФИКАЦИИ (выполняется вне этого проекта)
  • У меня нет конфигурации OWIN нигде в проекте (нет startup.cs, нет startup.auth.cs и т. Д.)

Обновление 2:

В отчаянии я пошел и добавил два новых контроллера в соответствии с маршрутом по умолчанию - мы назовем их «Путь1» и «Путь2» - чтобы соответствовать контроллеру по умолчанию ({контроллер} / {действие} / {id}) это ДАЖЕ В ФАЙЛЕ DARN ROUTECONFIG ДАЖЕ, но этот MVC все еще УСТАНАВЛИВАЕТ сопоставление. Это работает для моих базовых случаев (http://myapp/path1 и http://myapp/path2), но по-прежнему не работает для подпути (http://myapp/path1/subpath1).

Я в значительной степени определил, что либо моя конфигурация маршрута полностью игнорируется (не знаю почему), либо все параметры в моих путях просто не работают должным образом. Я прилагаю файл global.asax.cs и файл routeconfig.cs ниже (в его нынешнем виде).

using System;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Routing;

namespace MyNamespace
{
    public class Global : HttpApplication
    {
        void Application_Start(object sender, EventArgs e)
        {
            // Code that runs on application startup
            AreaRegistration.RegisterAllAreas();
            GlobalConfiguration.Configure(WebApiConfig.Register);
            RouteConfig.RegisterRoutes(RouteTable.Routes);            
        }
    }
}


using System.Web.Mvc;
using System.Web.Routing;

namespace MyNamespace
{
    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

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

У меня закончились идеи, и я хотел бы услышать все предложения.

Обновление 3:

В отчаянии я реализовал собственный обработчик маршрута. Меня даже не волнует, работает ли это сейчас; Я просто хочу, чтобы он достиг точки останова, когда я делаю запрос.

Я создал очень простой обработчик под названием «SpaRouteHandler», который возвращает мой собственный HttpHandler, творчески названный SpaHandler. В настоящий момент SpaHandler ничего не делает - он просто выдает исключение. Я просто хочу подтвердить, что эта чертова штука попадает под удар.

Вот последнее воплощение моего кода:

using System;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Routing;

namespace MyNamespace
{
    public class Global : HttpApplication
    {
        void Application_Start(object sender, EventArgs e)
        {
            // Code that runs on application startup
            AreaRegistration.RegisterAllAreas();
            GlobalConfiguration.Configure(WebApiConfig.Register);
            RouteConfig.RegisterRoutes(RouteTable.Routes);            
        }
    }
}



using System.Web.Mvc;
using System.Web.Routing;

namespace MyNamespace
{
    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            RouteValueDictionary defaults = new RouteValueDictionary {{"controller", "Home"}, {"action", "Index"}};
            var customRoute = new Route("{*.}", defaults, new SpaRouteHandler());
            routes.Add(customRoute);
        }
    }
}



using System.Web;
using System.Web.Routing;

namespace MyNamespace
{
    public class SpaRouteHandler : IRouteHandler
    {
        public IHttpHandler GetHttpHandler(RequestContext requestContext)
        {
            return new SpaHandler(requestContext);
        }
    }
}



using System;
using System.Net;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace MyNamespace
{
    public class SpaHandler : IHttpHandler
    {
        public RequestContext LocalRequestContext { get; set; }

        public SpaHandler(RequestContext requestContext)
        {
            LocalRequestContext = requestContext;
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }

        public void ProcessRequest(HttpContext context)
        {
            throw new NotImplementedException("Just throw an error please");
        }
    }
}

Исключение НИКОГДА не попадает. Старый добрый маршрут по умолчанию - которого НЕТ в конфигурации - по-прежнему работает.

Какого черта я здесь делаю не так?!?!?!?!?


person SyracuseCheer    schedule 23.06.2016    source источник
comment
Покажи свой RouteConfig.cs файл   -  person Nkosi    schedule 23.06.2016
comment
Я добавлю это выше.   -  person SyracuseCheer    schedule 23.06.2016


Ответы (2)


Как оказалось, это было странно. Я изменил пространство имен для веб-приложения с момента первоначального создания проекта и использовал инструмент рефакторинга ReSharper adjust namespaces для настройки пространств имен по всему проекту. Однако по какой-то причине он не изменил ссылку на пространство имен в атрибуте Inherits="" тега <Application /> в файле global.asax. Он ссылался на старую версию DLL, поэтому мой Application_Start даже не вызывался.

Как только я изменил эту ссылку, все заработало, как и планировалось.

person SyracuseCheer    schedule 24.06.2016

Попробуй это:

  app.UseMvc(routes =>
    {
        routes.MapRoute(name:"default", template:"{controller=Default}/{action=Index}/{id?}");

        routes.MapRoute("CatchAll", "{*url}", new {controller = "Default", action = "Index"});
    });
person null canvas    schedule 23.06.2016
comment
Это решение для MVC 5 или ASP.NET Core MVC? - person SyracuseCheer; 23.06.2016
comment
Кроме того, мне не нужен маршрут по умолчанию. В моем случае мой универсальный маршрут ЯВЛЯЕТСЯ маршрутом по умолчанию. - person SyracuseCheer; 23.06.2016
comment
Куда подевался этот код? Global.asax.cs? RouteConfig.cs (в App_Start)? - person SyracuseCheer; 23.06.2016
comment
Вы можете копировать только маршруты, но да, это обычно в Startup.cs - person null canvas; 23.06.2016
comment
Я почти уверен, что ваше решение предназначено для ASP.NET 5 (MVC 6). У объекта приложения в startup.cs нет метода UseMvc в MVC 5, иначе у меня что-то очень запуталось в моей конфигурации, потому что я этого не вижу. - person SyracuseCheer; 23.06.2016
comment
ок, можешь ли ты протестировать только эту строку routes.MapRoute("CatchAll", "{*url}", new {controller = "Default", action = "Index"}); - person null canvas; 23.06.2016
comment
Неа. Кажется, он хочет соответствовать стандартному маршруту MVC по умолчанию, даже если он был удален из конфигурации маршрута. Очень странно. Если я перейду к маршруту своего приложения (myapp), контроллер сработает, и мое представление будет возвращено со всем моим javascript. Однако, если я перейду на любой из определенных маршрутов (например, myapp / about), я получу 404. - person SyracuseCheer; 23.06.2016
comment
Фактически, даже если я определю жесткий, статический маршрут в верхней части конфигурации маршрута, что-то вроде url: "test/route" и укажу его на controller = Home и action = Index, он все равно будет проигнорирован, если я попытаюсь перейти по этому маршруту. Как будто приложение полностью игнорирует мой файл RouteConfig.cs. - person SyracuseCheer; 23.06.2016
comment
И, на всякий случай, если вам интересно, переход к http://myapp/home/index попадает в контроллер и не вызывает ошибку 404. - person SyracuseCheer; 23.06.2016