كيف يمكنني الحصول على كائن httpcontext من httpcontextbase في asp.net mvc 1؟

StackOverflow https://stackoverflow.com/questions/1992141

  •  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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top