วิธีที่ง่ายที่สุดคือรับแอปพลิเคชั่ApplicationInstance
นและใช้Context
คุณสมบัติ:
// httpContextBase is of type HttpContextBase
HttpContext context = httpContextBase.ApplicationInstance.Context;
(ขอบคุณอิชมาเอลสมีร์โนว์ที่กล่าวถึงเรื่องนี้ในความคิดเห็น)
คำตอบเดิม:
คุณสามารถทำได้โดยเฉพาะอย่างยิ่งถ้าHttpContextBase
อินสแตนซ์ที่คุณถนัดเป็นประเภทHttpContextWrapper
เวลาทำงาน ตัวอย่างต่อไปนี้แสดงวิธีการทำสิ่งนี้ มันซึมคุณมีวิธีการที่เรียกFoo
ว่ายอมรับบริบทเป็นHttpContextBase
แต่แล้วความต้องการที่จะเรียกวิธีการในบุคคลที่สามประกอบ (ที่คุณอาจไม่ได้โชคดีที่จะปรับเปลี่ยน) 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
มีวิธีการที่เรียกว่าเป็นผลมาจากการสนับสนุนGetService
IServiceProvider
การGetService
แทนที่ของHttpContextWrapper
ผู้รับมอบสิทธิ์ในการGetService
ใช้งานHttpContext
อินสแตนซ์ที่ถูกล้อม GetService
การดำเนินการHttpContext
ช่วยให้คุณแบบสอบถามสำหรับผู้ต้องสงสัยตามปกติเช่นHttpApplication
, HttpRequest
, HttpResponse
และอื่น ๆ มันก็จึงเกิดขึ้นว่าHttpApplication
มีคุณสมบัติที่เรียกว่าบริบทHttpContext
และซึ่งผลตอบแทนตัวอย่างของ ดังนั้นหนึ่งได้รับที่ห่อHttpContext
เช่นโดยการถามHttpContextBase
สำหรับการHttpApplication
ผ่านทางGetService
ตามด้วยการอ่านContext
ทรัพย์สินของกลับHttpApplication
อินสแตนซ์
ซึ่งแตกต่างHttpContextBase
, GetService
ไม่ปรากฏในฐานะสมาชิกของประชาชนHttpContext
แต่เป็นเพราะHttpContext
การดำเนินการIServiceProvider.GetService
อย่างชัดเจนในขณะที่HttpContextBase
ไม่ได้
โปรดจำไว้ว่าFoo
ไม่สามารถทดสอบได้อีกต่อไปเพราะอาศัยความสามารถในการแกะต้นแบบHttpContext
ในระหว่างการทดสอบและเป็นไปไม่ได้ที่จะปลอมแปลง / ต้นขั้วในครั้งแรก จุดของคำตอบนี้ แต่เป็นไปตามที่อยู่คำถามที่ว่า“ฉันจะได้รับวัตถุ HttpContext วิธีจาก HttpContextBase?” อย่างแท้จริง เทคนิคที่แสดงให้เห็นนั้นมีประโยชน์ในสถานการณ์เหล่านั้นที่คุณพบว่าตัวเองถูกคั่นกลางระหว่างส่วนประกอบที่คุณไม่จำเป็นต้องมีความหรูหราในการปรับเปลี่ยน