从相对路径获取绝对URL(重构方法)

Tru*_*an1 56 .net c# asp.net .net-3.5

我真的很惊讶,没有本地.NET方法从相对URL获取绝对URL.我知道这已经讨论了很多次,但从来没有遇到过一个能很好地处理这个问题的令人满意的方法.你能帮助微调下面的方法吗?

我认为我需要的只是自动选择协议而不是硬编码(http/https).我还缺少什么(警告,表演等)?

public static string GetAbsoluteUrl(string url)
    {
        //VALIDATE INPUT FOR ALREADY ABSOLUTE URL
        if (url.StartsWith("http://", StringComparison.OrdinalIgnoreCase) 
           || url.StartsWith("https://", StringComparison.OrdinalIgnoreCase))
        { 
            return url;
        }

        //GET PAGE REFERENCE FOR CONTEXT PROCESSING
        Page page = HttpContext.Current.Handler as Page;

        //RESOLVE PATH FOR APPLICATION BEFORE PROCESSING
        if (url.StartsWith("~/"))
        {
            url = page.ResolveUrl(url);
        }

        //BUILD AND RETURN ABSOLUTE URL
        return "http://" + page.Request.ServerVariables["SERVER_NAME"] + "/" 
                         + url.TrimStart('/');
    }
Run Code Online (Sandbox Code Playgroud)

Nat*_*lor 90

这一直是我解决这个小麻烦的方法.请注意,使用VirtualPathUtility.ToAbsolute(relativeUrl)允许将该方法声明为静态类中的扩展.

/// <summary>
/// Converts the provided app-relative path into an absolute Url containing the 
/// full host name
/// </summary>
/// <param name="relativeUrl">App-Relative path</param>
/// <returns>Provided relativeUrl parameter as fully qualified Url</returns>
/// <example>~/path/to/foo to http://www.web.com/path/to/foo</example>
public static string ToAbsoluteUrl(this string relativeUrl) {
    if (string.IsNullOrEmpty(relativeUrl))
        return relativeUrl;

    if (HttpContext.Current == null)
        return relativeUrl;

    if (relativeUrl.StartsWith("/"))
        relativeUrl = relativeUrl.Insert(0, "~");
    if (!relativeUrl.StartsWith("~/"))
        relativeUrl = relativeUrl.Insert(0, "~/");

    var url = HttpContext.Current.Request.Url;
    var port = url.Port != 80 ? (":" + url.Port) : String.Empty;

    return String.Format("{0}://{1}{2}{3}",
        url.Scheme, url.Host, port, VirtualPathUtility.ToAbsolute(relativeUrl));
}
Run Code Online (Sandbox Code Playgroud)

  • 很好的方法,只是一个小的修改,以便在https"var port = url.Port == 80 ||(url.Scheme =="https"&& url.Port == 443)时不添加端口?"":": "+ url.Port;" (3认同)
  • 老帖子,但我认为最好使用`url.IsDefaultPort`而不是检查http和https实例的端口号. (3认同)
  • 快速注意..有时我不想要路径的根,而是我想要的根.像这样:Page.ResolveUrl("SomePage.aspx").在你的方法中,这将假设我想要〜/ SomePage.aspx当我真的想〜/ path/to/where/I/current/am/SomePage.aspx.好方法! (2认同)

g.b*_*eze 66

new System.Uri(Page.Request.Url, "/myRelativeUrl.aspx").AbsoluteUri
Run Code Online (Sandbox Code Playgroud)


Car*_*lin 13

这个对我有用......

new System.Uri(Page.Request.Url, ResolveClientUrl("~/mypage.aspx")).AbsoluteUri
Run Code Online (Sandbox Code Playgroud)


Ste*_*ary 5

使用ASP.NET,您需要考虑"相对URL"的参考点 - 它是相对于页面请求,用户控件,还是仅仅因为使用"〜/"它是"相对的"?

Uri类包含一个简单的方法来转换一个相对URL为绝对URL(指定的绝对URL作为参考点相对URL):

var uri = new Uri(absoluteUrl, relativeUrl);
Run Code Online (Sandbox Code Playgroud)

如果relativeUrl实际上是一个绝对的URL,则absoluteUrl忽略它.

那么唯一的问题仍然是参考点是什么,以及是否允许"〜/"URL(Uri构造函数不翻译这些).