Я разрабатываю спа-центр 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");
}
}
}
Исключение НИКОГДА не попадает. Старый добрый маршрут по умолчанию - которого НЕТ в конфигурации - по-прежнему работает.
Какого черта я здесь делаю не так?!?!?!?!?
RouteConfig.cs
файл - person Nkosi   schedule 23.06.2016