Sau RC2 và 1.0, bạn không cần phải thêm một IHttpContextAccessor
lớp mở rộng cho mình nữa. Nó ngay lập tức có sẵn trong IUrlHelper
thô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 IHttpContextAccessor
giao diện để lấy HttpContext
. Một khi bạn có bối cảnh, sau đó bạn có thể lấy HttpRequest
ví dụ từ HttpContext.Request
và sử dụng tính chất của nó Scheme
, Host
, Protocol
vv 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 Startup
lớ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 IHttpContextAccessor
trong 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 IHttpContextAccessor
và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 GetDisplayUrl
hoặc GetEncodedUrl
từ UriHelper
lớ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
HttpContext
ví 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 IHttpContextAccessor
như 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());