Cách đơn giản nhất là tải ứng dụng ApplicationInstance
và 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 HttpContextBase
cá thể bạn được trao có loại HttpContextWrapper
và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à Foo
chấp nhận bối cảnh HttpContextBase
như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) { /* ... */ }
HttpContextBase
có một phương pháp được gọi GetService
là kết quả của hỗ trợ IServiceProvider
. Việc GetService
ghi đè các HttpContextWrapper
đại biểu để GetService
thực hiện các thể hiện được bao bọc HttpContext
. Các GetService
thực hiện HttpContext
cho phép bạn truy vấn cho nghi phạm thông thường như HttpApplication
, HttpRequest
, HttpResponse
và vân vân. Nó chỉ xảy ra HttpApplication
có 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 HttpContext
dụ bằng cách hỏi HttpContextBase
cho HttpApplication
qua GetService
tiếp bằng cách đọc các Context
tài sản của trở lại HttpApplication
ví dụ.
Không giống như HttpContextBase
, GetService
không xuất hiện với tư cách là thành viên của công chúng HttpContext
nhưng đó là vì HttpContext
thực hiện tính khám phá IServiceProvider.GetService
trong khiHttpContextBase
không.
Hãy nhớ rằng Foo
khô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 HttpContext
trong 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.