2012-01-02 23 views
5

Tôi đang thử nghiệm với việc tạo riêng tùy chỉnh HTTP Bối cảnh của tôi:Làm thế nào để khởi một HTTP Bối cảnh tùy chỉnh hoặc HttpContextBase

CustomHttpContext : HttpContextBase 
{ 
    public override HttpRequestBase Request { } 
} 

Một điều tôi không thể hình dung ra là làm thế nào để khởi tạo các lớp cơ sở với

System.Web.HttpContext.Current 

Có ai có bất kỳ ý tưởng làm thế nào tôi có thể khởi tạo bối cảnh tùy chỉnh đầu tiên với Http hiện tại sau đó ghi đè lên một số phương pháp/thuộc tính để phục vụ mục đích của riêng tôi?

Trả lời

7

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:

0

Chỉ cần thêm vào một chút để của dash câu trả lời, bạn cũng có thể sử dụng [ThreadStatic] thuộc tính với một số tài sản tĩnh. Khởi tạo nó trên BeginRequest, hoặc bằng cách sử dụng global.cs hoặc bằng cách viết HttpModule/HttpHandler của riêng bạn.

Làm thế nào để tạo ra một mô-đun web: http://msdn.microsoft.com/en-us/library/ms227673(v=vs.100).aspx

Chủ đề tĩnh: http://msdn.microsoft.com/en-us/library/system.threadstaticattribute.aspx

Các vấn đề liên quan