Как превратить относительный URL в полный URL? - PullRequest
62 голосов
/ 24 сентября 2008

Это, вероятно, легче объяснить на примере. Я пытаюсь найти способ перевернуть относительный URL, например, "/Foo.aspx" или "~ / Foo.aspx" в полный URL, например http://localhost/Foo.aspx. Таким образом, при развертывании для тестирования или этапа, когда домен, на котором работает сайт, отличается, я получу http://test/Foo.aspx и http://stage/Foo.aspx.

Есть идеи?

Ответы [ 12 ]

0 голосов
/ 17 июня 2016

Вот подход. Это не волнует, является ли строка относительной или абсолютной, но вы должны предоставить baseUri для ее использования.

    /// <summary>
    /// This function turns arbitrary strings containing a 
    /// URI into an appropriate absolute URI.  
    /// </summary>
    /// <param name="input">A relative or absolute URI (as a string)</param>
    /// <param name="baseUri">The base URI to use if the input parameter is relative.</param>
    /// <returns>An absolute URI</returns>
    public static Uri MakeFullUri(string input, Uri baseUri)
    {
        var tmp = new Uri(input, UriKind.RelativeOrAbsolute);
        //if it's absolute, return that
        if (tmp.IsAbsoluteUri)
        {
            return tmp;
        }
        // build relative on top of the base one instead
        return new Uri(baseUri, tmp);
    }

В контексте ASP.NET вы можете сделать это:

Uri baseUri = new Uri("http://yahoo.com/folder");
Uri newUri = MakeFullUri("/some/path?abcd=123", baseUri);
//
//newUri will contain http://yahoo.com/some/path?abcd=123
//
Uri newUri2 = MakeFullUri("some/path?abcd=123", baseUri);
//
//newUri2 will contain http://yahoo.com/folder/some/path?abcd=123
//
Uri newUri3 = MakeFullUri("http://google.com", baseUri);
//
//newUri3 will contain http://google.com, and baseUri is not used at all.
//
0 голосов
/ 09 мая 2016

Древний вопрос, но я думал, что отвечу на него, так как многие из ответов неполные.

public static string ResolveFullUrl(this System.Web.UI.Page page, string relativeUrl)
{
    if (string.IsNullOrEmpty(relativeUrl))
        return relativeUrl;

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

    return $"{page.Request.Url.Scheme}{Uri.SchemeDelimiter}{page.Request.Url.Authority}{VirtualPathUtility.ToAbsolute(relativeUrl)}";
}

Это работает как расширение off Page, точно так же, как ResolveUrl и ResolveClientUrl для веб-форм. Не стесняйтесь конвертировать его в расширение HttpResponse, если вы хотите или должны использовать его в среде без веб-форм. Он корректно обрабатывает как http, так и https, на стандартных и нестандартных портах, а также при наличии компонента имени пользователя / пароля. Также не используются жестко закодированные строки (а именно: //).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...