确定用户友好URL的物理路径

时间:2014-03-22 12:50:54

标签: asp.net webforms routing friendly-url

我被要求查看将旧的ASP.net Web窗体应用程序更新到ASP.net 4.5;专门实现微软的“用户友好”路由机制(NuGet Package Microsoft.AspNet.FriendlyUrls)。

一般来说,升级很简单,但我有一个问题。

原始开发人员将“元数据”XML文件附加/关联到许多网页。例如,/ Products/Tables/Oak.aspx也可能包含以下元文件/Products/Tables/Oak.aspx。元

当页面加载时,它会“查找”元文件并加载它。在非重写的URL环境中,这很容易......

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

在“友情网址”环境中,这并不容易,因为原始网址可能会被重写为/ Products / Tables / Oak,甚至可能通过自定义MapPageRoute()定义完全重写。

有没有人知道我是否有办法找到/确定页面的“真实”路径?

1 个答案:

答案 0 :(得分:0)

Petriq ASP.NET WebForms: Request.GetFriendlyUrlFileVirtualPath() returns empty string发布的解决方案在我的场景中完美运行。

供参考,这里是Petriq的HttpRequest扩展方法代码:

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