Sau RC2 và 1.0, bạn không cần phải thêm một IHttpContextAccessorlớp mở rộng cho mình nữa. Nó ngay lập tức có sẵn trong IUrlHelperthông qua urlhelper.ActionContext.HttpContext.Request. Sau đó, bạn sẽ tạo một lớp mở rộng theo cùng một ý tưởng, nhưng đơn giản hơn vì sẽ không liên quan đến việc tiêm.
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);
}
Để lại thông tin chi tiết về cách xây dựng nó sẽ tiêm accesor trong trường hợp chúng hữu ích cho ai đó. Bạn cũng có thể chỉ quan tâm đến url tuyệt đối của yêu cầu hiện tại, trong trường hợp đó, hãy xem phần cuối của câu trả lời.
Bạn có thể sửa đổi lớp tiện ích mở rộng của mình để sử dụng IHttpContextAccessorgiao diện để lấy HttpContext. Một khi bạn có bối cảnh, sau đó bạn có thể lấy HttpRequeství dụ từ HttpContext.Requestvà sử dụng tính chất của nó Scheme, Host, Protocolvv như trong:
string scheme = HttpContextAccessor.HttpContext.Request.Scheme;
Ví dụ: bạn có thể yêu cầu lớp của mình được định cấu hình bằng 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);
}
....
}
Đó là điều bạn có thể làm trên Startuplớp của mình (tệp Startup.cs):
public void Configure(IApplicationBuilder app)
{
...
var httpContextAccessor = app.ApplicationServices.GetRequiredService<IHttpContextAccessor>();
UrlHelperExtensions.Configure(httpContextAccessor);
...
}
Bạn có thể nghĩ ra nhiều cách khác nhau để nhận được IHttpContextAccessortrong lớp mở rộng của mình, nhưng nếu bạn muốn giữ các phương thức của mình làm phương thức mở rộng thì cuối cùng, bạn sẽ cần phải đưa IHttpContextAccessorvào lớp tĩnh của mình. (Nếu không, bạn sẽ cần IHttpContextđối số dưới dạng đối số trên mỗi cuộc gọi)
Chỉ nhận được tuyệt đối của yêu cầu hiện tại
Nếu bạn chỉ muốn nhận được tiểu tuyệt đối của yêu cầu hiện tại, bạn có thể sử dụng các phương thức mở rộng GetDisplayUrlhoặc GetEncodedUrltừ UriHelperlớp. (Khác với Ur L Helper)
GetDisplayUrl . Trả về các thành phần kết hợp của URL yêu cầu ở dạng hoàn toàn không thoát (ngoại trừ Chuỗi truy vấn) chỉ phù hợp để hiển thị. Định dạng này không được sử dụng trong tiêu đề HTTP hoặc các hoạt động HTTP khác.
GetEncodedUrl . Trả về các thành phần kết hợp của URL yêu cầu ở dạng thoát hoàn toàn phù hợp để sử dụng trong tiêu đề HTTP và các hoạt động HTTP khác.
Để sử dụng chúng:
- Bao gồm không gian tên
Microsoft.AspNet.Http.Extensions.
- Lấy
HttpContextví dụ. Nó đã có sẵn trong một số lớp (như chế độ xem dao cạo), nhưng ở những lớp khác, bạn có thể cần phải tiêm một IHttpContextAccessornhư giải thích ở trên.
- Sau đó, chỉ cần sử dụng chúng như trong
this.Context.Request.GetDisplayUrl()
Một giải pháp thay thế cho các phương pháp đó sẽ là tạo thủ công cho chính bạn tiểu tuyệt đối bằng cách sử dụng các giá trị trong HttpContext.Requestđối tượng (Tương tự như những gì RequestHttpsAttribute làm):
var absoluteUri = string.Concat(
request.Scheme,
"://",
request.Host.ToUriComponent(),
request.PathBase.ToUriComponent(),
request.Path.ToUriComponent(),
request.QueryString.ToUriComponent());