asp.net Core 1.0에서 현재 URL을 보는 방법


답변:


122

호스트와 경로를 별도로 가져와야합니다.

 @Context.Request.Host@Context.Request.Path

14
앱이 가상 디렉터리에있는 경우 올바른 URL을보고하지 않습니다. 당신은 접두사해야합니다 Request.Path의 로 값을 Request.PathBase의 가있는 경우 값. 이것은이 질문에 대한 거의 모든 답변에도 적용됩니다.
padigan 2017

@두 줄 사이에 이것은 무엇입니까 ? 설명해 주 시겠어요?
Mohammed Noureldin

3
@MohammedNoureldin : 그것은 면도기보기 구문입니다.
jack.pop

2
면도기 페이지 @HttpContext의 경우 @Context. 부분보기가 @Context작동합니다. 사용하는 것을 잊었습니까?
Andriod

2
MVC에 쉬운 방법이 있습니다. Url.Action("Action", null, null, Request.Url.Scheme); stackoverflow.com/questions/434604/…
Dan

110

스키마, 호스트, 경로 및 queryString이 필요합니다.

@string.Format("{0}://{1}{2}{3}", Context.Request.Scheme, Context.Request.Host, Context.Request.Path, Context.Request.QueryString)

또는 새로운 C # 6 기능 "문자열 보간"사용

@($"{Context.Request.Scheme}://{Context.Request.Host}{Context.Request.Path}{Context.Request.QueryString}")

1
test.com/abc#123 과 같이 조각을 어떻게 얻습니까? 요청에서 # 123 조각을 어떻게 얻습니까?
Ray

4
@fanray 당신은 할 수 없습니다. 브라우저가 URI 조각을 서버로 보내지 않습니다
tmg

UriBuilder 를 사용하여 URL 을 작성 하는 것이 좋습니다 .
Erik Philips 19

84

다음과 같은 확장 방법을 사용할 수 있습니다 Request.

Request.GetDisplayUrl()

33
@using Microsoft.AspNetCore.Http.Extensions다음 을 추가하면 작동합니다@Context.Request.GetDisplayUrl()
Serj Sagan

2
여전히 점점 - 요청이 현재 컨텍스트에 존재하지 않습니다
SeanMC

1
이 함수에 대한 intellisense 요약은 이것을 Suitable only for display. This format should not be used in HTTP headers or other HTTP operations.기반으로 @tmg의 솔루션이 가장 좋다고 생각합니다 (아마도 자신의 확장 방법으로 래핑되어 있음).
Gordon Glas 19

16

이것은 .net core 1.0에서 .net core 1.0에서 항상 가능하며 Microsoft.AspNetCore.Http.Extensions, HttpRequest전체 URL을 얻기 위해에 확장자를 추가합니다 . GetEncodedUrl .

예 : 면도기보기에서 :

@using Microsoft.AspNetCore.Http.Extensions
...
<a href="@Context.Request.GetEncodedUrl()">Link to myself</a>

2.0부터 상대 경로가 있고 GetEncodedPathAndQuery를 쿼리 합니다.


15

Uri 의 AbsoluteUri 속성을 사용합니다. .Net 코어를 사용하면 다음과 같은 요청에서 Uri를 빌드해야합니다.

 var location = new Uri($"{Request.Scheme}://{Request.Host}{Request.Path}{Request.QueryString}");

 var url = location.AbsoluteUri;

예를 들어 요청 URL이 ' http://www.contoso.com/catalog/shownew.htm?date=today '이면 동일한 URL을 반환합니다.


8
이와 같은 것들은 .Net Core가 어떤면에서 뒤로 물러 난 것이라고 생각하게합니다. 내가 상상할 수없는 어떤면에서 Asp.Net의 Request.Url보다 낫습니까?
Soenhay

8

이 확장 방법을 사용하는 것을 고려할 수 있습니다 ( Microsoft.AspNetCore.Http.Extensions네임 스페이스에서 :

@Context.Request.GetDisplayUrl()

일부 프로젝트의 경우 더 유연한 솔루션을 선호합니다. 두 가지 확장 방법이 있습니다.

1) 첫 번째 방법은 Uri들어오는 요청 데이터에서 객체를 생성 합니다 (선택적 매개 변수를 통한 일부 변형 포함). 2) 두 번째 메서드는 Uri개체를 받고 string다음 형식으로 반환 합니다 (후행 슬래시 없음) : Scheme_Host_Port

public static Uri GetUri(this HttpRequest request, bool addPath = true, bool addQuery = true)
    {
        var uriBuilder = new UriBuilder
        {
            Scheme = request.Scheme,
            Host = request.Host.Host,
            Port = request.Host.Port.GetValueOrDefault(80),
            Path = addPath ? request.Path.ToString() : default(string),
            Query = addQuery ? request.QueryString.ToString() : default(string)
        };
        return uriBuilder.Uri;
    }

    public static string HostWithNoSlash(this Uri uri)
    {
        return uri.GetComponents(UriComponents.SchemeAndServer, UriFormat.UriEscaped);
    }

용법:

//before >> https://localhost:44304/information/about?param1=a&param2=b
        Request.GetUri(addQuery: false);
        //after >> https://localhost:44304/information/about

        //before >> https://localhost:44304/information/about?param1=a&param2=b
        new Uri("https://localhost:44304/information/about?param1=a&param2=b").GetHostWithNoSlash();
        //after >> https://localhost:44304

7
public string BuildAbsolute(PathString path, QueryString query = default(QueryString), FragmentString fragment = default(FragmentString))
{
    var rq = httpContext.Request;
    return Microsoft.AspNetCore.Http.Extensions.UriHelper.BuildAbsolute(rq.Scheme, rq.Host, rq.PathBase, path, query, fragment);
}

하지만 당신은 어디로 가고 httpContext있습니까? 그것은 작동하지 않을 것입니다 Microsoft.AspNetCore.Http.HttpContext.Request
Tom Stickel

7

요청 에서 포트 번호를 얻으려면 Request.HostAspNet Core 의 속성을 통해 액세스해야합니다 .

Request.Host속성은, 대신, 호스트 도메인을 모두 보유하는 객체 단순히 문자열이 아니라 포트 번호를. 포트 번호가 URL에 구체적으로 기록 된 경우 (예 :) "https://example.com:8080/path/to/resource"호출 Request.Host하면 다음 과 같은 호스트 도메인과 포트 번호가 제공 "example.com:8080"됩니다..

호스트 도메인의 값만 원하거나 포트 번호의 값만 원할 경우 해당 속성에 개별적으로 액세스 할 수 있습니다 (예 : Request.Host.Host또는 Request.Host.Port).


6

@padigan의 의견과 마찬가지로 받아 들여진 대답이 도움이되었지만 쿼리 문자열 매개 변수를 포함하려면 다음을 시도하십시오.

@Context.Request.PathBase@Context.Request.GetEncodedPathAndQuery()

그리고 @using Microsoft.AspNetCore.Http.ExtensionsGetEncodedPathAndQuery () 메서드를 사용할 수 있으려면 뷰 를 추가해야 합니다.


1

Razor 페이지 또는 PageModel 클래스에서 현재 URL을 가져 오는 깔끔한 방법이 있습니다. 그건:

Url.PageLink()

MVC가 아닌 "ASP.NET Core Razor 페이지 "를 의미했습니다 .

ASP.NET Core 면도기 페이지에 표준 URL 메타 태그를 인쇄하려는 경우이 방법을 사용합니다. 그러나 문제가 있습니다. 해당 페이지에 대한 올바른 URL이어야하는 URL을 제공합니다. 설명하겠습니다.

페이지에 대해 "id"라는 경로를 정의 했으므로 URL은 다음과 같아야합니다.

http://example.com/product?id=34

Url.PageLink ()는 위에 표시된대로 정확히 해당 URL을 제공합니다.

이제 사용자가 해당 URL에 추가 내용을 추가하면

http://example.com/product?id=34&somethingElse

그러면이 메서드에서 "somethingElse"를 얻을 수 없습니다. 이것이 바로 HTML 페이지에서 표준 URL 메타 태그를 인쇄하는 데 아주 좋은 이유입니다.

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