RC2 및 1.0 이후 에는 더 이상 IHttpContextAccessor
확장 클래스 를 삽입 할 필요가 없습니다 . 를 IUrlHelper
통해 즉시 사용할 수 있습니다 urlhelper.ActionContext.HttpContext.Request
. 그런 다음 동일한 아이디어에 따라 확장 클래스를 만들지 만 주입이 필요하지 않으므로 더 간단합니다.
public static string AbsoluteAction(
this IUrlHelper url,
string actionName,
string controllerName,
object routeValues = null)
{
string scheme = url.ActionContext.HttpContext.Request.Scheme;
return url.Action(actionName, controllerName, routeValues, scheme);
}
누군가에게 유용 할 경우를 대비하여 액세서를 주입하는 방법에 대한 세부 정보를 남겨 둡니다. 현재 요청의 절대 URL에 관심이있을 수도 있습니다.이 경우 답변의 끝을 살펴보세요.
IHttpContextAccessor
인터페이스를 사용하여 확장 클래스를 수정하여 HttpContext
. 당신이 컨텍스트가되면, 당신은 얻을 수 HttpRequest
에서 인스턴스를 HttpContext.Request
하고 해당 속성 사용 Scheme
, Host
, Protocol
같이 등 :
string scheme = HttpContextAccessor.HttpContext.Request.Scheme;
예를 들어 클래스를 HttpContextAccessor로 구성해야 할 수 있습니다.
public static class UrlHelperExtensions
{
private static IHttpContextAccessor HttpContextAccessor;
public static void Configure(IHttpContextAccessor httpContextAccessor)
{
HttpContextAccessor = httpContextAccessor;
}
public static string AbsoluteAction(
this IUrlHelper url,
string actionName,
string controllerName,
object routeValues = null)
{
string scheme = HttpContextAccessor.HttpContext.Request.Scheme;
return url.Action(actionName, controllerName, routeValues, scheme);
}
....
}
Startup
클래스 (Startup.cs 파일) 에서 수행 할 수있는 작업은 다음과 같습니다.
public void Configure(IApplicationBuilder app)
{
...
var httpContextAccessor = app.ApplicationServices.GetRequiredService<IHttpContextAccessor>();
UrlHelperExtensions.Configure(httpContextAccessor);
...
}
IHttpContextAccessor
확장 클래스에서 를 가져 오는 다른 방법을 생각 해낼 수 있지만, 결국 메서드를 확장 메서드로 유지하려면 IHttpContextAccessor
정적 클래스에 를 삽입해야합니다 . (그렇지 않으면 IHttpContext
각 호출에서 인수로이 필요합니다 )
현재 요청의 absoluteUri 가져 오기
그냥 현재 요청의 절대 URI를 얻고 싶은 경우에, 당신은 확장 방법을 사용할 수 있습니다 GetDisplayUrl
또는 GetEncodedUrl
로부터 UriHelper
클래스입니다. (Ur L Helper 와 다른 점 )
GetDisplayUrl . 표시 전용으로 적합한 완전히 이스케이프되지 않은 형식 (QueryString 제외)으로 요청 URL의 결합 된 구성 요소를 반환합니다. 이 형식은 HTTP 헤더 또는 기타 HTTP 작업에 사용해서는 안됩니다.
GetEncodedUrl . HTTP 헤더 및 기타 HTTP 작업에 사용하기에 적합한 완전히 이스케이프 된 형식으로 요청 URL의 결합 된 구성 요소를 반환합니다.
그것들을 사용하려면 :
- 네임 스페이스를 포함합니다
Microsoft.AspNet.Http.Extensions
.
HttpContext
인스턴스를 가져 옵니다 . 이미 일부 클래스 (예 : 면도기 뷰)에서 사용할 수 있지만 다른 클래스에서는 IHttpContextAccessor
위에서 설명한대로 를 주입해야 할 수 있습니다 .
- 그런 다음 그대로 사용하십시오.
this.Context.Request.GetDisplayUrl()
이러한 메서드에 대한 대안은 HttpContext.Request
개체 의 값을 사용하여 절대 URI를 수동으로 만드는 것입니다 ( RequireHttpsAttribute 가 수행 하는 작업과 유사 ).
var absoluteUri = string.Concat(
request.Scheme,
"://",
request.Host.ToUriComponent(),
request.PathBase.ToUriComponent(),
request.Path.ToUriComponent(),
request.QueryString.ToUriComponent());