Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can't handle routing correctly in mixed VS environment

I am creating a new project in Visual Studio using the SPA template. My goal is to have an Angular/SPA application that will "host"/contain some legacy applications that will eventually be modernized/migrated. So, I have an iframe on a page in my SPA app, and when a menu item is clicked, I want to load one of the legacy ASP.NET apps in that iframe (it has to be in an iframe, as the legacy site used them, and its architecture relies on them). I am having trouble getting the routing right. The SPA template defines a DefaultRoute class like this (I changed RouteExistingFiles to true):

    public class DefaultRoute : Route
{
    public DefaultRoute()
        : base("{*path}", new DefaultRouteHandler()) {
        this.RouteExistingFiles = true;
    }
}

and I have edited the RouteConfig.cs file to ignore "aspx" page requests, like this:

    public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes) {
        routes.Ignore("*.aspx");
        routes.Add("Default", new DefaultRoute());
    }
}

The default route handler that is defined, looks like this:

   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;
    }
}

The directory structure is like this:

MySPA

  • SPA <- contains the SPA application (.net 4.5)

  • Legacy <- contains the legacy applications (.net 3.0)

In IIS, I have the legacy folder set as a virtual directory (subdirectory) within the SPA application.

How do I set up routing so that, when a menu item is clicked, and the request is sent (containing a url that has query string information) for an .aspx page, the request can be routed to the legacy application?

like image 425
rogdawg Avatar asked Nov 09 '22 09:11

rogdawg


1 Answers

I have solved this issue. The issue was caused by several problems. But, the problem that most pertains to my information above was this...I needed to find the correct way to ignore the requests for the legacy aspx pages from within the routing code of the new site. So, in the RouteConfig.cs file, I placed this ignore statement as the first line of the RegisterRoute function:

routes.Ignore("{*allaspx}", new { allaspx =  @".*\.aspx(/.*)?"});

That corrected the main issue, there were other minor issues that confused the situation but, I have identified what they are and I am working on those. So, ignoring the legacy urls in the routing functionality was the correct solution.

like image 171
rogdawg Avatar answered Nov 15 '22 10:11

rogdawg