it-swarm-ko.com

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

내가 만들고있는 블로그에 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>
338
Chev

Request.RawUrl , Request.Url.OriginalString , Request.Url.ToString() 또는 Request.Url.AbsoluteUri를 사용할 수 있습니다.

506
Darin Dimitrov

코드에 다음 확장 메서드를 추가하십시오.

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이 아닌 다른 포트를 사용하는 시스템에서 발생하는 Asp.Net에서 버그가 있습니다 (내부 웹 사이트가 가상 IP에서로드 균형 조정을 통해 게시되는 경우 큰 문제가 있음) 포트는 규칙을 게시하기 위해 내부적으로 사용됩니다). Asp.Net은 원래 요청이 그것을 사용하지 않더라도 항상AbsoluteUri 속성의 포트를 추가합니다.

이 코드는로드 균형 조정 등을 수행하기 전에 반환 된 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>

나는 ILSpy에서 HttpRequest.Url를 보면서 이것을 보았습니다 - 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가 트위터에 언급했습니다

47
Andras Zoltan
public static string GetCurrentWebsiteRoot()
{
    return HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority);
}
12
Brian Ogden
Request.Url.PathAndQuery

완벽하게 작동해야합니다. 특히 우 리만 상대하기를 원한다면 (그러나 쿼리 스트링은 계속 유지해야합니다)

11
Lucius

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

@Request.Url.GetLeftPart(UriPartial.Path)

쿼리 문자열을 "사용하지 않고"전체 프로토콜, 호스트 및 경로를 가져옵니다. 또한 기본값 80 이외의 값을 사용하는 경우 포트가 포함됩니다.

8
johnw182

내가 좋아하는 것...

Url.Content(Request.Url.PathAndQuery)

아니면 ...

Url.Action()
4
Carter Medlin

다른 답변에서 언급되지 않은 한 가지는 여러 위치에서 참조 될 경우 대/소문자 구분입니다 (이 질문은 원래의 질문에는 없지만이 질문은 유사한 검색에서 많이 나타납니다). ). 다른 답변을 바탕으로 나는 다음과 같은 것들이 처음에는 나를 위해 일한다는 것을 발견했다.

Request.Url.AbsoluteUri.ToString()

그러나 더 신뢰할 수있게하기 위해 다음이되었습니다 :

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

그리고 나서 내 요구 사항 (사이트가 어떤 도메인 이름에서 액세스되고 있는지 확인하고 관련 콘텐츠를 표시) :

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

0
Lyall

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

HttpContext.Request.UrlReferrer
0
Hamit YILDIRIM

내게는 HTTPContext이 아직 준비되지 않은 동안 Controller 생성자에서 HTTPContext에 액세스하려고 시도했을 때 문제가 발생했습니다. Index 메서드 내에서 이동하면 다음과 같이 작동합니다.

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