Как превратить относительный 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 ]

58 голосов
/ 24 сентября 2008

Поиграйте с этим (модифицированный отсюда )

public string ConvertRelativeUrlToAbsoluteUrl(string relativeUrl) {
    return string.Format("http{0}://{1}{2}",
        (Request.IsSecureConnection) ? "s" : "", 
        Request.Url.Host,
        Page.ResolveUrl(relativeUrl)
    );
}
38 голосов
/ 26 января 2012

Это было избито до смерти, но я думал, что выложу свое собственное решение, которое я считаю чище, чем многие другие ответы.

public static string AbsoluteAction(this UrlHelper url, string actionName, string controllerName, object routeValues)
{
    return url.Action(actionName, controllerName, routeValues, url.RequestContext.HttpContext.Request.Url.Scheme);
}

public static string AbsoluteContent(this UrlHelper url, string path)
{
    Uri uri = new Uri(path, UriKind.RelativeOrAbsolute);

    //If the URI is not already absolute, rebuild it based on the current request.
    if (!uri.IsAbsoluteUri)
    {
        Uri requestUrl = url.RequestContext.HttpContext.Request.Url;
        UriBuilder builder = new UriBuilder(requestUrl.Scheme, requestUrl.Host, requestUrl.Port);

        builder.Path = VirtualPathUtility.ToAbsolute(path);
        uri = builder.Uri;
    }

    return uri.ToString();
}
34 голосов
/ 15 сентября 2011

Вам просто нужно создать новый URI, используя page.request.url, а затем получить AbsoluteUri этого:

New System.Uri(Page.Request.Url, "Foo.aspx").AbsoluteUri
5 голосов
/ 07 мая 2010

Это моя вспомогательная функция, чтобы сделать это

public string GetFullUrl(string relativeUrl) {
    string root = Request.Url.GetLeftPart(UriPartial.Authority);
    return root + Page.ResolveUrl("~/" + relativeUrl) ;
}
4 голосов
/ 21 января 2013

Я подумал, что поделюсь своим подходом к этому в ASP.NET MVC с использованием класса Uri и некоторой магии расширения.

public static class UrlHelperExtensions
{
    public static string AbsolutePath(this UrlHelper urlHelper, 
                                      string relativePath)
    {
        return new Uri(urlHelper.RequestContext.HttpContext.Request.Url,
                       relativePath).ToString();
    }
}

Затем вы можете вывести абсолютный путь, используя:

// gives absolute path, e.g. https://example.com/customers
Url.AbsolutePath(Url.Action("Index", "Customers"));

С вложенными вызовами методов это выглядит немного уродливо, поэтому я предпочитаю расширить UrlHelper с помощью общих методов действий, чтобы я мог сделать:

// gives absolute path, e.g. https://example.com/customers
Url.AbsoluteAction("Index", "Customers");

или

Url.AbsoluteAction("Details", "Customers", new{id = 123});

Полный класс расширения выглядит следующим образом:

public static class UrlHelperExtensions
{
    public static string AbsolutePath(this UrlHelper urlHelper, 
                                      string relativePath)
    {
        return new Uri(urlHelper.RequestContext.HttpContext.Request.Url,
                       relativePath).ToString();
    }

    public static string AbsoluteAction(this UrlHelper urlHelper, 
                                        string actionName, 
                                        string controllerName)
    {
        return AbsolutePath(urlHelper, 
                            urlHelper.Action(actionName, controllerName));
    }

    public static string AbsoluteAction(this UrlHelper urlHelper, 
                                        string actionName, 
                                        string controllerName, 
                                        object routeValues)
    {
        return AbsolutePath(urlHelper, 
                            urlHelper.Action(actionName, 
                                             controllerName, routeValues));
    }
}
2 голосов
/ 10 ноября 2010

Это вспомогательная функция, которую я создал для преобразования.

//"~/SomeFolder/SomePage.aspx"
public static string GetFullURL(string relativePath)
{
   string sRelative=Page.ResolveUrl(relativePath);
   string sAbsolute=Request.Url.AbsoluteUri.Replace(Request.Url.PathAndQuery,sRelative);
   return sAbsolute;
}
2 голосов
/ 24 сентября 2008

Используйте класс .NET Uri, чтобы объединить ваш относительный путь и имя хоста.
http://msdn.microsoft.com/en-us/library/system.uri.aspx

1 голос
/ 19 февраля 2013

В ASP.NET MVC вы можете использовать перегрузки HtmlHelper или UrlHelper, которые принимают параметры protocol или host. Когда любой из этих параметров не является пустым, помощники генерируют абсолютный URL. Это метод расширения, который я использую:

public static MvcHtmlString ActionLinkAbsolute<TViewModel>(
    this HtmlHelper<TViewModel> html, 
    string linkText, 
    string actionName, 
    string controllerName, 
    object routeValues = null,
    object htmlAttributes = null)
{
    var request = html.ViewContext.HttpContext.Request;
    var url = new UriBuilder(request.Url);
    return html.ActionLink(linkText, actionName, controllerName, url.Scheme, url.Host, null, routeValues, htmlAttributes);
}

И используйте его из вида Razor, например ::

 @Html.ActionLinkAbsolute("Click here", "Action", "Controller", new { id = Model.Id }) 
1 голос
/ 17 сентября 2012

Просто:

url = new Uri(baseUri, url);
0 голосов
/ 22 апреля 2017

Изменено из другого ответа для работы с localhost и другими портами ... я использую для ex. ссылки по электронной почте. Вы можете звонить из любой части приложения, не только на странице или в пользовательском контроле, я помещаю это в Global, так как нет необходимости передавать HttpContext.Current.Request в качестве параметра

            /// <summary>
            ///  Return full URL from virtual relative path like ~/dir/subir/file.html
            ///  usefull in ex. external links
            /// </summary>
            /// <param name="rootVirtualPath"></param>
            /// <returns></returns>
            public static string GetAbsoluteFullURLFromRootVirtualPath(string rootVirtualPath)
            {

                return string.Format("http{0}://{1}{2}{3}",
                    (HttpContext.Current.Request.IsSecureConnection) ? "s" : ""
                    , HttpContext.Current.Request.Url.Host
                    , (HttpContext.Current.Request.Url.IsDefaultPort) ? "" : ":" + HttpContext.Current.Request.Url.Port
                    , VirtualPathUtility.ToAbsolute(rootVirtualPath)
                    );

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