Microsoft.AspNet.Http.HttpRequest에서 원시 URL 가져 오기


87

HttpRequestAsp.Net 5 (vNext)의 클래스와 같은 요청의 URL에 대한 분석 사항, (다른 것들 사이에) 포함 Scheme, Host, Path

그러나 원래 요청 URL을 노출하는 곳은 아직 발견되지 않았습니다. (이전 버전에는 Request.Uri)

HttpRequest에서 사용할 수있는 구성 요소에서 함께 조각하지 않고도 원시 URL을 다시 가져올 수 있습니까?


1
이 문제에 대해 이전에 버그가 제출 된 것 같지만 닫혔습니다 ... 버그에 대한 세부 정보를 확인할 수 있으며 더 강하다고 느끼면 세부 정보로 업데이트 할 수 있습니다. github.com/aspnet/HttpAbstractions/issues/110
Kiran Challa 2015-01-24

@KiranChalla : 이전 버전에서 RawURL이 무엇인지 궁금해 지긴하지만, 저는 약간의 요점을 가지고 있습니다. 나는 그들이 현재 계획, 호스트 등에 대해 보여주는 것은 요청 자체에 대한 것이 아니라 요청을 처리하는 서버 측에서 나눌 수 있다고 생각합니다.
Jon Egerton 2015 년

ToString () 시도 했습니까?
화성에서 아구아

답변:


82

직접 액세스 할 수없는 것 같지만 프레임 워크를 사용하여 빌드 할 수 있습니다.

Microsoft.AspNetCore.Http.Extensions.UriHelper.GetFullUrl(Request)

위의 방법을 확장 방법으로 사용할 수도 있습니다.

이것은 string대신 a를 반환 Uri하지만 목적에 부합해야합니다! (이것은 또한의 역할을하는 것 같습니다 UriBuilder.)

@mswietlicki에게 감사드립니다. 그리고 내 대답에서 네임 스페이스 변경을 지적하기 위해 @CF에도!


4
베타 -5에서는 더 이상 작동하지 않습니다. 나는 좋은 대안이 없거나 내 대답을 업데이트 할 것입니다.
Matt DeKrey

13
이것이 진정한 확장 방법이라고 생각합니다 . 사용 사례에 따라 네임 스페이스를 가져오고 GetEncodedUri또는 호출하기 만하면 GetDisplayUri됩니다.
dlras2 2015 년

42
Microsoft.AspNet.Http.Extensions 사용; 그 Request.GetDisplayUrl ()
mswietlicki

8
오른쪽 공간은 이제 Microsoft.AspNetCore.Http.Extensions이다
CF

9
ASP.NET Core 1.0의 경우 "Microsoft.AspNetCore.Http.Extensions"를 Razor보기에 추가합니다. URL을 얻으려면 "@ Context.Request.GetDisplayUrl ()"을 사용하십시오.
Joop

75

Nuget 패키지 추가 / 사용 :

using Microsoft.AspNetCore.Http.Extensions; 

(ASP.NET Core RC1에서는 Microsoft.AspNet.Http.Extensions에있었습니다)

그런 다음 다음을 실행하여 전체 http 요청 URL을 얻을 수 있습니다.

var url = httpContext.Request.GetEncodedUrl();

또는

var url = httpContext.Request.GetDisplayUrl();

목적에 따라.


현재 ASP.NET Core RC2를 사용할 수 있나요?
Sergey G.


소스를 보면 일부 인코딩 / 디코딩을 명확하게 수행하므로 원시 URL이 아닙니다. 또한 IIS는 때때로 Kestrel에 도달하기 전에 URL을 변경합니다 (예 : % 2F-> /).
Daniel Leach

1
@TomStickel 무슨 말을하는지 잘 모르겠습니다 ... 둘 중 하나를 사용하는 데 문제가 없었습니다. using대답에 설명 된대로 파일에 지시문 이 있는지 확인하십시오. 이는 "일반적인"방법이 아니라 확장 방법이기 때문입니다.
Nick Mertin

1
@TomStickel 박람회. ASP.NET Core 2.2 용으로 설치된 Microsoft.AspNetCore.All 패키지 (2.0에서도 테스트 됨)를 사용하면 잘 작동합니다.
Nick Mertin 2019

16

당신이 경우 정말 원하는 실제, 원시 URL을 다음과 같은 확장 방법을 사용할 수 있습니다 :

public static class HttpRequestExtensions
{
    public static Uri GetRawUrl(this HttpRequest request)
    {
        var httpContext = request.HttpContext;

        var requestFeature = httpContext.Features.Get<IHttpRequestFeature>();

        return new Uri(requestFeature.RawTarget);
    }
}

이 메서드는 개체 자체 RawTarget에 표시되지 않는 요청을 활용합니다 HttpRequest. 이 속성은 ASP.NET Core의 1.0.0 릴리스에 추가되었습니다. 해당 버전 또는 최신 버전을 실행하고 있는지 확인하십시오.

노트! 이 속성은 원시 URL을 노출 하므로 설명서에 명시된대로 디코딩되지 않았습니다.

이 속성은 라우팅 또는 권한 결정에 내부적으로 사용되지 않습니다. UrlDecoded가 아니므로 사용시주의해야합니다.


전체 .NET Framework와 함께 ASP .NET Core를 사용하고 있습니다. 이것은 나를 위해 작동하지 않는 것 같습니다 ( RawTarget에 정의되지 않았습니다 IHttpRequestFeature). 대안을 생각할 수 있습니까?
Tomáš Hübelbauer

1
RawTarget1.0 버전에 추가 된 5 월에 다시 . 최신 버전에서 실행하고 있습니까?
khellang

1
IIS를 사용하여 호스팅하는 경우 IIS는 때때로 Kestrel에 도달하기 전에 URL을 변경합니다. 이에 대한 한 가지 예는 % 2F가 /로 디코딩된다는 것입니다.
Daniel Leach

이것은 단연코 권위있는 대답입니다.
Chris Marisic

이것은 전체 URL이 아닌 URL 경로를 제공하는 것으로 보입니다
Iain Ballard

10

.NET Core razor에서 :

@using Microsoft.AspNetCore.Http.Extensions
@Context.Request.GetEncodedUrl() //Use for any purpose (encoded for safe automation)

두 번째 줄 대신 사용할 수도 있습니다.

@Context.Request.GetDisplayUrl() //Use to display the URL only

7

다른 솔루션은 URI객체를 직접 원했기 때문에 내 요구 사항에 적합하지 않았고이 경우 문자열 연결을 피하는 것이 더 낫다고 생각하므로 a를 사용하는 것 UriBuilder보다이 확장 메서드를 만들었으며 다음 과 같은 URL에서도 작동합니다 http://localhost:2050.

public static Uri GetUri(this HttpRequest request)
{
    var uriBuilder = new UriBuilder
    {
        Scheme = request.Scheme,
        Host = request.Host.Host,
        Port = request.Host.Port.GetValueOrDefault(80),
        Path = request.Path.ToString(),
        Query = request.QueryString.ToString()
    };
    return uriBuilder.Uri;
}

1
잘 했어. 또한 선택적 매개 변수로 솔루션을 개선했습니다. 따라서 내가 검색하려는 URI 부분을 제어 할 수 있습니다. 예를 들어 호스트 만 또는 쿼리 문자열이없는 전체 경로 등
user3172616

@ user3172616 좋은 생각입니다!
giammin

1
(80)이어야합니다 (-1). 당신은 (예를 들어,이 잘못된 URI를 생성 헤더 "호스트"생략 포트 HTTPS 계획이있는 경우 https://myweb:80/에, (-1)그것이 될 것이다 https://myweb).
Igor Dražić

4

다음 확장 메서드는 pre-beta5의 논리를 재현합니다 UriHelper.

public static string RawUrl(this HttpRequest request) {
    if (string.IsNullOrEmpty(request.Scheme)) {
        throw new InvalidOperationException("Missing Scheme");
    }
    if (!request.Host.HasValue) {
        throw new InvalidOperationException("Missing Host");
    }
    string path = (request.PathBase.HasValue || request.Path.HasValue) ? (request.PathBase + request.Path).ToString() : "/";
    return request.Scheme + "://" + request.Host + path + request.QueryString;
}

3

이 확장은 나를 위해 작동합니다.

Microsoft.AspNetCore.Http 사용;

    public static class HttpRequestExtensions
    {
        public static string GetRawUrl(this HttpRequest request)
        {
            var httpContext = request.HttpContext;
            return $"{httpContext.Request.Scheme}://{httpContext.Request.Host}{httpContext.Request.Path}{httpContext.Request.QueryString}";
        }
    }

0

ASP.NET 5 beta5에서 :

Microsoft.AspNet.Http.Extensions.UriHelper.Encode(
    request.Scheme, request.Host, request.PathBase, request.Path, request.QueryString);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.