Как получить URL текущей страницы в MVC 3 - PullRequest
342 голосов
/ 15 марта 2011

Я использую плагин комментариев Facebook в блоге, который я создаю. У него есть некоторые теги FBXML, которые интерпретируются JavaScript-кодом Facebook, на который есть ссылка на странице.

Это все работает нормально, но я должен передать текущий полный URL-адрес плагину.

<div style="width: 900px; margin: auto;">
    <div id="fb-root"></div>
    <fb:comments href="URL HERE" num_posts="10" width="900"></fb:comments>
</div>

Каков наилучший способ получить URL текущей страницы? URL запроса.

Решение

Вот окончательный код моего решения:

<fb:comments href="@Request.Url.AbsoluteUri" num_posts="15" width="900"></fb:comments>

Ответы [ 9 ]

510 голосов
/ 15 марта 2011

Вы можете использовать Request.RawUrl, Request.Url.OriginalString, Request.Url.ToString() или Request.Url.AbsoluteUri.

47 голосов
/ 15 марта 2011

Добавьте этот метод расширения к вашему коду:

public static Uri UrlOriginal(this HttpRequestBase request)
{
  string hostHeader = request.Headers["host"];

  return new Uri(string.Format("{0}://{1}{2}",
     request.Url.Scheme, 
     hostHeader, 
     request.RawUrl));
}

И затем вы можете выполнить его из свойства RequestContext.HttpContext.Request.

В Asp.Net существует ошибка (может быть обойдена стороной, см. Ниже), которая возникает на машинах, которые используют порты, отличные от порта 80, для локального веб-сайта (большая проблема, если внутренние веб-сайты публикуются с помощью балансировки нагрузки на виртуальном IP и порты используются внутренне для правил публикации), при этом Asp.Net будет всегда добавлять порт в свойстве AbsoluteUri - даже если исходный запрос не использует его.

Этот код гарантирует, что возвращаемый URL-адрес всегда будет равен URL-адресу, который браузер первоначально запросил (включая порт - как он будет включен в заголовок узла), прежде чем произойдет какая-либо балансировка нагрузки и т. Д.

По крайней мере, это происходит в нашей (довольно запутанной!) Среде:)

Если между ними есть какие-нибудь прикольные прокси, которые переписывают заголовок хоста, то это тоже не сработает.

Обновление от 30 июля 2013 г.

Как упомянуто @KevinJones в комментариях ниже - настройка, о которой я упоминаю в следующем разделе, была задокументирована здесь: http://msdn.microsoft.com/en-us/library/hh975440.aspx

Хотя я должен сказать, что не смог заставить его работать, когда попробовал - но это может быть просто я сделал опечатку или что-то в этом роде.

Обновление от 9 июля 2012 года

Я сталкивался с этим некоторое время назад и хотел обновить этот ответ, но так и не сделал. Когда на этот ответ только что пришли возражения, я подумал, что должен сделать это сейчас.

«Ошибка», о которой я упоминаю в Asp.Net, может управляться явно недокументированным значением appSettings - так называемым 'aspnet:UseHostHeaderForRequest' - т.е.:

<appSettings>
  <add key="aspnet:UseHostHeaderForRequest" value="true" />
</appSettings>

Я сталкивался с этим, глядя на HttpRequest.Url в ILSpy - обозначенном ---> слева от следующей копии / вставки из этого представления ILSpy:

public Uri Url
{
  get
  {
    if (this._url == null && this._wr != null)
    {
      string text = this.QueryStringText;
      if (!string.IsNullOrEmpty(text))
      {
        text = "?" + HttpEncoder.CollapsePercentUFromStringInternal(text, 
          this.QueryStringEncoding);
      }
 ---> if (AppSettings.UseHostHeaderForRequestUrl)
      {
        string knownRequestHeader = this._wr.GetKnownRequestHeader(28);
        try
        {
          if (!string.IsNullOrEmpty(knownRequestHeader))
          {
            this._url = new Uri(string.Concat(new string[]
            {
              this._wr.GetProtocol(),
              "://",
              knownRequestHeader,
              this.Path,
              text 
            }));
          }
        }
        catch (UriFormatException)
        { }
     }
     if (this._url == null) { /* build from server name and port */
       ...

Лично я не использовал его - он недокументирован и, следовательно, не гарантированно останется поблизости - однако он может сделать то же самое, что я упомянул выше. Чтобы повысить релевантность результатов поиска и признать кого-то, кто, кажется, обнаружил это, параметр 'aspnet:UseHostHeaderForRequest' также упоминается Ником Эйсевесом в Twitter

13 голосов
/ 04 октября 2014
public static string GetCurrentWebsiteRoot()
{
    return HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority);
}
11 голосов
/ 27 февраля 2015
Request.Url.PathAndQuery

должно работать идеально, особенно если вам нужен только относительный Uri (но с сохранением строк запроса)

8 голосов
/ 07 августа 2015

Я тоже искал это по причинам Facebook, и ни один из приведенных ответов не работал должным образом или слишком сложен.

@Request.Url.GetLeftPart(UriPartial.Path)

Получает полный протокол, хост и путь "без" строки запроса,Также включает порт, если вы используете что-то отличное от значения по умолчанию 80.

4 голосов
/ 09 ноября 2016

Мой любимый ...

Url.Content(Request.Url.PathAndQuery)

или просто ...

Url.Action()
0 голосов
/ 13 июня 2019

Случай (стиль одной страницы) для истории браузера

HttpContext.Request.UrlReferrer
0 голосов
/ 27 декабря 2016

Для меня проблема заключалась в том, что я пытался получить доступ к HTTPContext в конструкторе контроллера, пока HTTPContext еще не готов. При перемещении внутри метода Index это работало:

var uri = new Uri(Request.Url.AbsoluteUri);
url = uri.Scheme + "://" + uri.Host + "/";enter code here
0 голосов
/ 25 августа 2016

Одна вещь, которая не упоминается в других ответах, это чувствительность к регистру, если на нее будут ссылаться в нескольких местах (чего нет в исходном вопросе, но стоит принять во внимание, так как этот вопрос появляется во многихподобных поисков).Основываясь на других ответах, я обнаружил, что изначально у меня сработало:

Request.Url.AbsoluteUri.ToString()

Но для большей надежности это стало:

Request.Url.AbsoluteUri.ToString().ToLower()

И затем для моих требований (проверка, с какого доменного имени осуществляется доступ к сайту и показ соответствующего контента):

Request.Url.AbsoluteUri.ToString().ToLower().Contains("xxxx")

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