HttpRequest
Asp.Net 5 (vNext)의 클래스와 같은 요청의 URL에 대한 분석 사항, (다른 것들 사이에) 포함 Scheme
, Host
, Path
등
그러나 원래 요청 URL을 노출하는 곳은 아직 발견되지 않았습니다. (이전 버전에는 Request.Uri
)
HttpRequest에서 사용할 수있는 구성 요소에서 함께 조각하지 않고도 원시 URL을 다시 가져올 수 있습니까?
HttpRequest
Asp.Net 5 (vNext)의 클래스와 같은 요청의 URL에 대한 분석 사항, (다른 것들 사이에) 포함 Scheme
, Host
, Path
등
그러나 원래 요청 URL을 노출하는 곳은 아직 발견되지 않았습니다. (이전 버전에는 Request.Uri
)
HttpRequest에서 사용할 수있는 구성 요소에서 함께 조각하지 않고도 원시 URL을 다시 가져올 수 있습니까?
답변:
직접 액세스 할 수없는 것 같지만 프레임 워크를 사용하여 빌드 할 수 있습니다.
Microsoft.AspNetCore.Http.Extensions.UriHelper.GetFullUrl(Request)
위의 방법을 확장 방법으로 사용할 수도 있습니다.
이것은 string
대신 a를 반환 Uri
하지만 목적에 부합해야합니다! (이것은 또한의 역할을하는 것 같습니다 UriBuilder
.)
@mswietlicki에게 감사드립니다. 그리고 내 대답에서 네임 스페이스 변경을 지적하기 위해 @CF에도!
GetEncodedUri
또는 호출하기 만하면 GetDisplayUri
됩니다.
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();
목적에 따라.
using
대답에 설명 된대로 파일에 지시문 이 있는지 확인하십시오. 이는 "일반적인"방법이 아니라 확장 방법이기 때문입니다.
당신이 경우 정말 원하는 실제, 원시 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가 아니므로 사용시주의해야합니다.
RawTarget
에 정의되지 않았습니다 IHttpRequestFeature
). 대안을 생각할 수 있습니까?
다른 솔루션은 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;
}
(80)
이어야합니다 (-1)
. 당신은 (예를 들어,이 잘못된 URI를 생성 헤더 "호스트"생략 포트 HTTPS 계획이있는 경우 https://myweb:80/
에, (-1)
그것이 될 것이다 https://myweb
).
다음 확장 메서드는 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;
}
이 확장은 나를 위해 작동합니다.
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}";
}
}