Как я могу постоянно получать абсолютный, полный корневой или базовый URL-адрес сайта независимо от того, находится ли сайт в виртуальном каталоге и независимо от того, где мой код находится в структуре каталогов? Я перепробовал все переменные и функции, которые только мог придумать, и не нашел подходящего способа.
Я хочу получить URL-адрес текущего сайта, то есть http://www.example.com или, если это виртуальный каталог, http://www.example.com/DNN/
Вот некоторые из вещей, которые я пробовал, и результат. Единственный, который включает в себя весь нужный мне фрагмент (http: // локальный: 4471 / DNN441), - это Request.URI.AbsoluteURI:





Есть отличное обсуждение и идеи по Блог Рика Страла
Обновлено: я должен добавить, что идеи работают с действующим HttpContext или без него.
EDIT2: вот конкретный комментарий / код в этом посте, который отвечает на вопрос
Вы пробовали AppSettings.RootUrl, который обычно настраивается в файле web.config?
Это будет для модуля DotNetNuke, и большинство сайтов DotNetNuke не имеют этого параметра.
Вы про использование в качестве ссылок?
если это так, то выполнение этого <a href='/'>goes to root</a> приведет вас к файлу по умолчанию корневого веб-каталога.
Теперь для клиентской стороны передача "~ /" методу Control :: ResolveUrl предоставит вам то, что вы ищете. (http://msdn.microsoft.com/en-us/library/system.web.ui.control.resolveurl.aspx)
Нет, это будут относительные ссылки. Мне нужен абсолютный, полностью квалифицированный корень. У меня есть множество случаев, когда мне это нужно, конкретный прямо сейчас - я могу передать URL-адреса возврата и отмены в Paypal.
На данный момент у меня нет возможности проверить это, но пробовали ли вы "Request.Url.AbsoluteUri" с другого компьютера?
Мне приходит в голову, что что касается вашей машины, браузер запрашивает у localhost.
Я могу ошибаться, но я думаю, что запрос относится к браузеру, а не к веб-серверу.
Прочитав ответ, представленный в блоге Рика Страла, я обнаружил, что то, что мне действительно нужно, было довольно простым. Сначала вам нужно определить относительный путь (который для меня был простой частью) и передать его в функцию, определенную ниже:
VB.NET
Public Shared Function GetFullyQualifiedURL(ByVal s as string) As String
Dim Result as URI = New URI(HttpContext.Current.Request.Url, s)
Return Result.ToString
End Function
C#
public static string GetFullyQualifiedURL(string s) {
Uri Result = new Uri(HttpContext.Current.Request.Url, s);
return Result.ToString();
}
Я думаю, это работает, только если ваш текущий запрос уже находится в корне. В противном случае он относится к каталогу текущих запросов, а не к корневому каталогу серверного приложения. Я добился успеха с: Request.Url.GetLeftPart (UriPartial.Authority) + Request.ApplicationPath
Найдено этот код здесь:
string appPath = null;
appPath = string.Format("{0}://{1}{2}{3}",
Request.Url.Scheme,
Request.Url.Host,
Request.Url.Port == 80 ? string.Empty : ":" + Request.Url.Port,
Request.ApplicationPath);
Принятый ответ предполагает, что текущий запрос уже находится на сервере / виртуальном корне. Попробуй это:
Request.Url.GetLeftPart(UriPartial.Authority) + Request.ApplicationPath
Иногда я считаю, что это предпочтительный вариант. Еще недостаточно, чтобы изменить его на принятый ответ, но, возможно, со временем.
Последний пост на странице действительно кажется мне нужным ответом. Я не «принял» этот ответ, потому что я ненавижу, когда людям приходится читать все там, чтобы добраться до окончательного ответа ... Не уверен, стоит ли мне просто репостить последний пост здесь или какое лучшее решение .