MVC 3에서 현재 페이지 URL을 얻는 방법


360

빌드중인 블로그에서 Facebook 댓글 플러그인을 사용하고 있습니다. 페이지에서 참조되는 페이스 북 자바 스크립트로 해석되는 일부 FBXML 태그가 있습니다.

이 모든 것이 잘 작동하지만 현재 정규화 된 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>

답변:


533

당신은 사용할 수 Request.RawUrl, Request.Url.OriginalString, Request.Url.ToString()또는 Request.Url.AbsoluteUri.


2
어떤 이유로, 이것은 전체 URL을 얻는 것이 아니라 도메인 뒤의 모든 것을 얻는 것처럼 보입니다.
Chev

6
@Chevex, 방법에 대한 Request.Url.ToString()또는 Request.Url.AbsoluteUri?
Darin Dimitrov

9
거의. Request.Url.AbsoluteUri그것을했다 :)
Chev

2
@Chevex-사이트가 어떤 포트에 호스팅됩니까? 포트 80이면 그렇습니다. 다른 포트 (예 : 81)의 하나 이상의 컴퓨터에 가상 IP 게시 포트 80이있는 환경에서는 Asp.Net이 항상 : 81을 URL에 잘못 추가합니다.
Andras Zoltan

29
다른 URL 조각의 샘플을 얻으려면 다음을 살펴보십시오. cambiaresearch.com/articles/53/…
ms007

48

이 확장 방법을 코드에 추가하십시오.

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속성에서 실행할 수 있습니다 .

로컬 웹 사이트에 포트 80 이외의 포트를 사용하는 컴퓨터에서 발생하는 버그 (아래 단계 참조, 아래 참조)가 있습니다 (내부 웹 사이트가 가상 IP에서로드 밸런싱을 통해 게시되는 경우 큰 문제) 포트는 내부적으로 규칙을 게시하는 데 사용됩니다. 따라서 Asp.Net은 AbsoluteUri원래 요청 에서 포트를 사용하지 않더라도 항상 포트를 속성 에 추가 합니다.

이 코드는 로드 밸런싱 등이 발생하기 전에 반환 된 URL이 브라우저가 원래 요청한 URL (호스트 헤더에 포함 된 포트 포함) 과 항상 동일한 지 확인합니다 .

적어도, 그것은 (우리보다 복잡한) 환경에서 않습니다 :)

호스트 헤더를 다시 쓰는 사이에 펑키 프록시가 있으면 작동하지 않습니다.

2013 년 7 월 30 일 업데이트

아래 주석에서 @KevinJones가 언급했듯이 다음 섹션에서 언급 한 설정은 여기에 설명되어 있습니다. http://msdn.microsoft.com/en-us/library/hh975440.aspx

나는 그것을 시도했을 때 그것을 작동시킬 수 없다고 말해야하지만-오타 나 무언가를 만드는 것이 될 수 있습니다.

2012 년 7 월 9 일 업데이트

나는 얼마 전에 이것을 보았고이 답변을 업데이트하려고했지만 결코하지 않았습니다. upvote가 방금이 답변에 왔을 때 나는 지금해야한다고 생각했다.

Asp.Net에서 언급 한 '버그'는 문서화되지 않은 appSettings 값으로 제어 할 수 있습니다 'aspnet:UseHostHeaderForRequest'.

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

보면서 나는이 건너 온 HttpRequest.UrlILSpy에 -에 의해 표시 --->에서 다음 사본의 왼쪽에 / 그 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'설정은 트위터의 Nick Aceves에 의해 언급되었습니다.


좋아, 어디서 또는 어떻게 HttpRequestBase의 인스턴스를 가져 와서 컨트롤러에서 직접 코드로 작업하지 않았다고 말할 수 있습니까?
PositiveGuy

@CoffeeAddict 음, mvc3에는 Asp.net 4가 기본 추상화를 사용하기 때문에 HttpContext.Current.Request가 있습니다. .NET 3.5 또는 것은 낮은 경우 System.Web.Abstractions에서, 동일한 속성 주위 HttpRequestWrapper을 사용할 수 있습니다
안드라스 졸탄

3
매우 늦었지만 UseHostHeaderForRequestUrl은 여기에 문서화되어 있습니다. msdn.microsoft.com/en-us/library/hh975440.aspx
Kevin Jones

좋은 자리! 적어도 그들은 4.5 문서를 위해 그것을 마침내 추가했습니다!
Andras Zoltan

14
public static string GetCurrentWebsiteRoot()
{
    return HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority);
}

12
Request.Url.PathAndQuery

상대 Uri 만 원하지만 쿼리 문자열을 유지하려는 경우 특히 완벽하게 작동해야합니다.


8

나도 페이스 북의 이유로 이것을 찾고 있었고 지금까지 주어진 답변 중 어느 것도 필요하거나 너무 복잡하지 않았습니다.

@Request.Url.GetLeftPart(UriPartial.Path)

쿼리 문자열을 "없이"전체 프로토콜, 호스트 및 경로를 가져옵니다. 기본 80 이외의 것을 사용하는 경우 포트도 포함합니다.


좋은 발견! 질문 할 때 이것이 존재하지 않았다고 생각합니까? 나는 그것을 보았을 것 같은 느낌이 든다 :)
Chev

방금 추가 된 부분을 보았지만 방금 확인했으며 .NET 1.1 이후에 있었던 것 같습니다. 누가 알아.
johnw182

4

내가 좋아하는 것...

Url.Content(Request.Url.PathAndQuery)

아니면 그냥 ...

Url.Action()

Url.Action ()은 URL의 오른쪽만을 제공합니다. 전체 URL이 필요한 경우 어떻게해야합니까?
Alok

1

다른 답변에서 언급되지 않은 한 가지 사례는 여러 위치에서 참조 될 경우 대소 문자 구분입니다 (원래 질문에는 없지만이 질문이 많은 유사한 검색에 나타남에 따라 고려할 가치가 있음) ). 다른 답변을 바탕으로 처음에 다음이 효과가 있음을 알았습니다.

Request.Url.AbsoluteUri.ToString()

그러나 더 신뢰할 수 있도록 다음과 같이되었습니다.

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

그런 다음 내 요구 사항 (사이트에 액세스하는 도메인 이름 확인 및 관련 내용 표시) :

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


"더 신뢰할 수있는"것은 아닙니다. 소문자를 줄이는 것이 유용한 지 여부는 실제로 실제로하려는 일과 대소 문자를 구분하는 이유에 전적으로 달려 있습니다. 일반적으로 당신이 URL이 대소 문자를 구분되고 싶어요.
CodeCaster

1
@CodeCaster 네, '보다 안정적인'이라는 용어는 내 경험에 기반을 두었습니다. URL은 클라이언트에게 아무런 문제를 일으키지 않기 때문에 대소 문자를 구분하지 않기를 바랍니다.
Lyall

0

나를 위해 문제는 아직 준비가되지 않은 상태 HTTPContext에서 Controller의 생성자 에 액세스하려고했을 때였습니다 HTTPContext. Index 메서드 내로 이동하면 다음과 같이 작동합니다.

var uri = new Uri(Request.Url.AbsoluteUri);
url = uri.Scheme + "://" + uri.Host + "/";enter code here

0

브라우저 기록의 사례 (단일 페이지 스타일)

HttpContext.Request.UrlReferrer
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.