无法在混合 VS 环境中正确处理路由
Can't handle routing correctly in mixed VS environment
我正在 Visual Studio 使用 SPA 模板创建一个新项目。我的目标是拥有一个 Angular/SPA 应用程序,它将 "host"/包含一些最终将成为 modernized/migrated 的遗留应用程序。因此,我的 SPA 应用程序的页面上有一个 iframe,单击菜单项时,我想加载该 iframe 中的遗留 ASP.NET 应用程序之一(它必须位于 iframe 中,因为遗留站点使用它们,其架构依赖于它们)。
我无法正确选择路由。 SPA 模板定义了这样一个 DefaultRoute class(我将 RouteExistingFiles 更改为 true):
public class DefaultRoute : Route
{
public DefaultRoute()
: base("{*path}", new DefaultRouteHandler()) {
this.RouteExistingFiles = true;
}
}
并且我编辑了 RouteConfig.cs 文件以忽略 "aspx" 页面请求,如下所示:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes) {
routes.Ignore("*.aspx");
routes.Add("Default", new DefaultRoute());
}
}
定义的默认路由处理程序如下所示:
public class DefaultRouteHandler : IRouteHandler
{
public IHttpHandler GetHttpHandler(RequestContext requestContext) {
// Use cases:
// ~/ -> ~/views/index.cshtml
// ~/about -> ~/views/about.cshtml or ~/views/about/index.cshtml
// ~/views/about -> ~/views/about.cshtml
// ~/xxx -> ~/views/404.cshtml
var filePath = requestContext.HttpContext.Request.AppRelativeCurrentExecutionFilePath;
if (filePath == "~/") {
filePath = "~/views/index.cshtml";
}
else {
if (!filePath.StartsWith("~/views/", StringComparison.OrdinalIgnoreCase)) {
filePath = filePath.Insert(2, "views/");
}
if (!filePath.EndsWith(".cshtml", StringComparison.OrdinalIgnoreCase)) {
filePath = filePath += ".cshtml";
}
}
var handler = WebPageHttpHandler.CreateFromVirtualPath(filePath); // returns NULL if .cshtml file wasn't found
if (handler == null) {
requestContext.RouteData.DataTokens.Add("templateUrl", "/views/404");
handler = WebPageHttpHandler.CreateFromVirtualPath("~/views/404.cshtml");
}
else {
requestContext.RouteData.DataTokens.Add("templateUrl", filePath.Substring(1, filePath.Length - 8));
}
return handler;
}
}
目录结构是这样的:
MySPA
SPA <- 包含 SPA 应用程序 (.net 4.5)
旧版 <- 包含旧版应用程序 (.net 3.0)
在 IIS 中,我将 legacy 文件夹设置为 SPA 应用程序中的虚拟目录(子目录)。
如何设置路由,以便在单击菜单项并发送请求(包含具有查询字符串信息的 url).aspx 页面时,请求可以是路由到遗留应用程序?
我已经解决了这个问题。这个问题是由几个问题引起的。但是,与我上面的信息最相关的问题是......我需要找到正确的方法来忽略新站点路由代码中对遗留 aspx 页面的请求。因此,在 RouteConfig.cs 文件中,我将此忽略语句放在 RegisterRoute 函数的第一行:
routes.Ignore("{*allaspx}", new { allaspx = @".*\.aspx(/.*)?"});
这纠正了主要问题,还有其他一些小问题使情况变得混乱,但我已经确定它们是什么,并且正在努力解决这些问题。因此,忽略路由功能中的遗留 url 是正确的解决方案。
我正在 Visual Studio 使用 SPA 模板创建一个新项目。我的目标是拥有一个 Angular/SPA 应用程序,它将 "host"/包含一些最终将成为 modernized/migrated 的遗留应用程序。因此,我的 SPA 应用程序的页面上有一个 iframe,单击菜单项时,我想加载该 iframe 中的遗留 ASP.NET 应用程序之一(它必须位于 iframe 中,因为遗留站点使用它们,其架构依赖于它们)。 我无法正确选择路由。 SPA 模板定义了这样一个 DefaultRoute class(我将 RouteExistingFiles 更改为 true):
public class DefaultRoute : Route
{
public DefaultRoute()
: base("{*path}", new DefaultRouteHandler()) {
this.RouteExistingFiles = true;
}
}
并且我编辑了 RouteConfig.cs 文件以忽略 "aspx" 页面请求,如下所示:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes) {
routes.Ignore("*.aspx");
routes.Add("Default", new DefaultRoute());
}
}
定义的默认路由处理程序如下所示:
public class DefaultRouteHandler : IRouteHandler
{
public IHttpHandler GetHttpHandler(RequestContext requestContext) {
// Use cases:
// ~/ -> ~/views/index.cshtml
// ~/about -> ~/views/about.cshtml or ~/views/about/index.cshtml
// ~/views/about -> ~/views/about.cshtml
// ~/xxx -> ~/views/404.cshtml
var filePath = requestContext.HttpContext.Request.AppRelativeCurrentExecutionFilePath;
if (filePath == "~/") {
filePath = "~/views/index.cshtml";
}
else {
if (!filePath.StartsWith("~/views/", StringComparison.OrdinalIgnoreCase)) {
filePath = filePath.Insert(2, "views/");
}
if (!filePath.EndsWith(".cshtml", StringComparison.OrdinalIgnoreCase)) {
filePath = filePath += ".cshtml";
}
}
var handler = WebPageHttpHandler.CreateFromVirtualPath(filePath); // returns NULL if .cshtml file wasn't found
if (handler == null) {
requestContext.RouteData.DataTokens.Add("templateUrl", "/views/404");
handler = WebPageHttpHandler.CreateFromVirtualPath("~/views/404.cshtml");
}
else {
requestContext.RouteData.DataTokens.Add("templateUrl", filePath.Substring(1, filePath.Length - 8));
}
return handler;
}
}
目录结构是这样的:
MySPA
SPA <- 包含 SPA 应用程序 (.net 4.5)
旧版 <- 包含旧版应用程序 (.net 3.0)
在 IIS 中,我将 legacy 文件夹设置为 SPA 应用程序中的虚拟目录(子目录)。
如何设置路由,以便在单击菜单项并发送请求(包含具有查询字符串信息的 url).aspx 页面时,请求可以是路由到遗留应用程序?
我已经解决了这个问题。这个问题是由几个问题引起的。但是,与我上面的信息最相关的问题是......我需要找到正确的方法来忽略新站点路由代码中对遗留 aspx 页面的请求。因此,在 RouteConfig.cs 文件中,我将此忽略语句放在 RegisterRoute 函数的第一行:
routes.Ignore("{*allaspx}", new { allaspx = @".*\.aspx(/.*)?"});
这纠正了主要问题,还有其他一些小问题使情况变得混乱,但我已经确定它们是什么,并且正在努力解决这些问题。因此,忽略路由功能中的遗留 url 是正确的解决方案。