Câu trả lời đơn giản là không, điều đó là không thể. Cũng lưu ý rằng HttpContext không kế thừa từ HttpContextBase, thay vào đó, cả hai đều triển khai IServiceProvider. Cuối cùng, HttpContext được niêm phong, cho thấy rằng các tác giả không muốn mọi người làm bất cứ điều gì khác ngoài việc tiêu thụ lớp này.
Vì bạn không nghi ngờ gì bởi HttpContextBase có một hàm tạo parameterless nên thậm chí không cung cấp cho bạn tùy chọn instantiating nó từ yêu cầu hiện tại và response như HttpContext!
Hãy sử dụng một 'decompiler' để có một cái nhìn tại các triển khai HttpContext.Current:
// System.Web.HttpContext
/// <summary>Gets or sets the <see cref="T:System.Web.HttpContext" /> object for the current HTTP request.</summary>
/// <returns>The <see cref="T:System.Web.HttpContext" /> for the current HTTP request.</returns>
public static HttpContext Current
{
get
{
return ContextBase.Current as HttpContext;
}
set
{
ContextBase.Current = value;
}
}
Nếu chúng ta hãy nhìn vào ContextBase.Current (từ System.Web.Hosting.ContextBase):
// System.Web.Hosting.ContextBase
internal static object Current
{
get
{
return CallContext.HostContext;
}
[SecurityPermission(SecurityAction.Demand, Unrestricted = true)]
set
{
CallContext.HostContext = value;
}
}
và CallContext (trong System.Runtime.Messaging):
// System.Runtime.Remoting.Messaging.CallContext
/// <summary>Gets or sets the host context associated with the current thread.</summary>
/// <returns>The host context associated with the current thread.</returns>
/// <exception cref="T:System.Security.SecurityException">The immediate caller does not have infrastructure permission. </exception>
public static object HostContext
{
[SecurityCritical]
get
{
IllogicalCallContext illogicalCallContext = Thread.CurrentThread.GetIllogicalCallContext();
object hostContext = illogicalCallContext.HostContext;
if (hostContext == null)
{
LogicalCallContext logicalCallContext = CallContext.GetLogicalCallContext();
hostContext = logicalCallContext.HostContext;
}
return hostContext;
}
[SecurityCritical]
set
{
if (value is ILogicalThreadAffinative)
{
IllogicalCallContext illogicalCallContext = Thread.CurrentThread.GetIllogicalCallContext();
illogicalCallContext.HostContext = null;
LogicalCallContext logicalCallContext = CallContext.GetLogicalCallContext();
logicalCallContext.HostContext = value;
return;
}
LogicalCallContext logicalCallContext2 = CallContext.GetLogicalCallContext();
logicalCallContext2.HostContext = null;
IllogicalCallContext illogicalCallContext2 = Thread.CurrentThread.GetIllogicalCallContext();
illogicalCallContext2.HostContext = value;
}
}
Chúng ta bắt đầu để có được một cảm giác về cách HttpContext đang được lấy ra. Nó đang được đóng gói với chủ đề người dùng hiện tại bắt đầu khi họ visted trang web (mà làm cho cảm giác hoàn hảo!). Xóa thêm chúng ta có thể thấy nó cũng được tạo lại theo yêu cầu (xem bên dưới).
Chúng ta cũng có thể thấy, tại lớp giao diện, HttpContext.Current không thể thay đổi để trỏ vào HttpContext của riêng bạn vì thuộc tính không phải là ảo. Nó cũng sử dụng nhiều lớp BCL là riêng tư hoặc nội bộ, do đó bạn không thể chỉ đơn giản là sao chép hầu hết các thực hiện.
Điều gì sẽ dễ dàng hơn và cũng ít bị ảnh hưởng bởi bất kỳ vấn đề nào khác là chỉ cần bọc HttpContext với đối tượng CustomContext của riêng bạn. Bạn có thể chỉ cần bọc HttpContext.Current trong một thuộc tính BaseContext, sau đó có các thuộc tính của riêng bạn trên lớp (và sử dụng bất kỳ phiên làm việc nào, cơ sở dữ liệu hoặc cơ chế lưu trữ trạng thái dựa trên yêu cầu mà bạn muốn lưu trữ và truy xuất các thuộc tính của riêng bạn).
Cá nhân, tôi muốn sử dụng lớp của riêng mình để lưu trữ thông tin của riêng mình vì nó thuộc về ứng dụng và người dùng của tôi, v.v. không thực sự liên quan đến đường dẫn http hoặc xử lý yêu cầu/phản hồi.
Xem thêm: