Cách đơn giản nhất là tải ứng dụng ApplicationInstancevà sử dụng thuộc tính của nó Context:
// httpContextBase is of type HttpContextBase
HttpContext context = httpContextBase.ApplicationInstance.Context;
(cảm ơn Ishmael Smyrnow đã lưu ý điều này trong các bình luận)
Câu trả lời gốc:
Bạn có thể, đặc biệt là nếu HttpContextBasecá thể bạn được trao có loại HttpContextWrappervào thời gian chạy. Ví dụ sau minh họa cách bạn có thể làm điều này. Nó giả sử bạn có một phương thức gọi là Foochấp nhận bối cảnh HttpContextBasenhưng sau đó cần gọi một phương thức trong hội đồng bên thứ ba (rằng bạn có thể không có may mắn sửa đổi) đang mong đợi bối cảnh sẽ được nhập vào HttpContext.
void Foo(HttpContextBase context)
{
var app = (HttpApplication) context.GetService(typeof(HttpApplication));
ThirdParty.Bar.Baz(app.Context);
}
// Somewhere in assembly and namespace ThirdParty,
// in a class called Bar, there is Baz expecting HttpContext:
static void Baz(HttpContext context) { /* ... */ }
HttpContextBasecó một phương pháp được gọi GetServicelà kết quả của hỗ trợ IServiceProvider. Việc GetServiceghi đè các HttpContextWrapperđại biểu để GetServicethực hiện các thể hiện được bao bọc HttpContext. Các GetServicethực hiện HttpContextcho phép bạn truy vấn cho nghi phạm thông thường như HttpApplication, HttpRequest, HttpResponsevà vân vân. Nó chỉ xảy ra HttpApplicationcó một thuộc tính được gọi là Ngữ cảnh và trả về một thể hiện của HttpContext. Vì vậy, ai được vào bọc HttpContextdụ bằng cách hỏi HttpContextBasecho HttpApplicationqua GetServicetiếp bằng cách đọc các Contexttài sản của trở lại HttpApplicationví dụ.
Không giống như HttpContextBase, GetServicekhông xuất hiện với tư cách là thành viên của công chúng HttpContextnhưng đó là vì HttpContextthực hiện tính khám phá IServiceProvider.GetServicetrong khiHttpContextBase không.
Hãy nhớ rằng Fookhông còn có thể kiểm tra được vì nó phụ thuộc vào việc có thể mở khóa cơ bản HttpContexttrong quá trình thử nghiệm và điều này là không thể giả mạo / sơ khai ở nơi đầu tiên. Vấn đề của câu trả lời này, tuy nhiên, là để giải quyết các câu hỏi: “Làm thế nào để tôi nhận được một HttpContext đối tượng từ HttpContextBase?”, Theo nghĩa đen . Kỹ thuật minh họa rất hữu ích trong những tình huống mà bạn thấy mình bị kẹp giữa các thành phần mà bạn không nhất thiết phải có sự sang trọng để sửa đổi.