วิธีที่ง่ายที่สุดคือรับแอปพลิเคชั่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?” อย่างแท้จริง เทคนิคที่แสดงให้เห็นนั้นมีประโยชน์ในสถานการณ์เหล่านั้นที่คุณพบว่าตัวเองถูกคั่นกลางระหว่างส่วนประกอบที่คุณไม่จำเป็นต้องมีความหรูหราในการปรับเปลี่ยน