كيف يمكنني الحصول على كائن httpcontext من httpcontextbase في asp.net mvc 1؟
-
22-09-2019 - |
سؤال
أنا أعمل مع بعض أدوات WebForms/MVC-Agnostic ، وأنا بحاجة إلى الحصول على مثيل HttpContext
إعطاء إشارة إلى HttpContextBase
هدف. لا يمكنني استخدام HttpContext.Current
لأنني بحاجة إلى العمل بشكل غير متزامن أيضًا (HttpContext.Current
عائدات null
خلال طلب غير متزامن). أنا على علم HttpContextWrapper
, ، ولكن يذهب بالطريقة الخاطئة.
المحلول
أبسط طريقة هي الحصول على التطبيق ، 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؟" ، حرفيا. إن التقنية المصورة مفيدة في تلك المواقف التي تجد فيها نفسك محصوراً بين المكونات التي ليس لديك بالضرورة الرفاهية التي يجب تعديلها.
نصائح أخرى
تستطيع،
var abstractContext = new System.Web.HttpContextWrapper(System.Web.HttpContext.Current);
لا يمكنك.
الغرض كله من HttpContextBase
هو التخلص من التبعية على الخرسانة HttpContext
صف دراسي. بينما هو مايو تحتوي على خرسانة HttpContext
(كما هو الحال مع httpContextWrapper
), ، قد لا علاقة لها بالتطبيقات الأخرى على الإطلاق HttpContext
.
أفضل خيار لك هو تحديد مصنع مجردة مخصص يمكنه الحصول على ملف HttpContextBase
بالنسبة لك ، حيث يمكنك دائمًا لف خرسانة HttpContext
في HttpContextWrapper
.