Question

I have been asked to look at updating an old ASP.net Web Forms application to ASP.net 4.5; specifically to implement Microsoft's 'User Friendly' routing mechanism (NuGet Package Microsoft.AspNet.FriendlyUrls).

Generally, the upgrade was straightforward, but I am left with one problem.

The original developer attached/associated 'meta data' XML files to many of the web pages.. For example, /Products/Tables/Oak.aspx might also have the following meta file /Products/Tables/Oak.aspx.meta

When the page loads, it 'looks' for the meta file and loads it. In a non-rewritten URL environment, this was easy...

string metaUrl = Page.Request.Url.AbsolutePath + ".meta";
string metaPath = Page.Server.MapPath(metaUrl);
If (System.IO.File.Exists(metaPath)) {
   LoadMetaFile(metaPath);
}

In a 'Friendly URL' environment, this is not so easy as the original URL might be rewritten to /Products/Tables/Oak or maybe even rewritten completely via a custom MapPageRoute() definition.

Does anyone know if there a way that I can find/determine the 'true' path of the page?

Was it helpful?

Solution

The solution posted by Petriq ASP.NET WebForms: Request.GetFriendlyUrlFileVirtualPath() returns empty string works perfectly in my scenario.

For reference, here is Petriq's code for his HttpRequest extension method:

using System.Web;
using System.Web.Routing;
using Microsoft.AspNet.FriendlyUrls;

namespace Utils.Extensions
{
   public static class HttpRequestExtensions
   {
       public static string GetFileVirtualPathFromFriendlyUrl(this HttpRequest request) 
       {
          string ret = string.Empty;

          ret = request.GetFriendlyUrlFileVirtualPath();

          if (ret == string.Empty)
          {
            foreach (RouteBase r in RouteTable.Routes)
            {
                if (r.GetType() == typeof(Route))
                {
                    Route route = (Route)r;
                    // Following line modified for case-insensitive comparison
                    if (String.Compare("/" + route.Url, request.Path, true) == 0)
                    {
                        if (route.RouteHandler.GetType() == typeof(PageRouteHandler))
                        {
                            PageRouteHandler handler = (PageRouteHandler)route.RouteHandler;

                            ret = handler.VirtualPath;
                        }
                        break;
                    }
                }
            }
          }

          return ret;
       }
   }
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top