سؤال

ما هي أسهل طريقة لاستنساخ مثيل httpcontext للطلب الحالي؟

أنا أقدم تطبيق في ASP.NET MVC V1.. وبعد قمت بترقية قدرات جزئية منتظمة للحصول على وحدات تحكم فرعية تعمل بشكل مشابه للغاية، ولكن لها سياقها الخاص. عند استخدام Partialviews، يجب عليك ملء البيانات عن العرض الجزئي في إجراء تحكم العرض الرئيسي الخاص بك. قمت بإنشاء وظائفي الخاصة التي تجعل من الممكن استدعاء إجراءات التحكم من ضمن طريقة عرض. بهذه الطريقة أحصل عليها:

  • ليس لدي لتقديم بيانات الرؤية الفرعية في إجراء تحكم رأيي الرئيسي
  • يمكن طرق تحكم الفرعية معالجة البيانات أكثر مغناصة دون أي علاقة مع طرق عرض / وحدات تحكم أخرى

المشكلة هي أن كل طلب تحكم فرعي يستخدم httpcontext. لذلك عندما أقوم بتعيين بعض httpcontext.Item في وحدة تحكم فرعية، فإنه في الواقع يملأ httpcontext للطلب الفعلي.

لهذا السبب أريد استنساخ HttpContext. أنا أستخدم بالفعل:

HttpContext subContext = new HttpContext(request, response);
// what happened to Session, User, Items etc. properties?

ولكن هذا لا يضع أي شيء آخر غير الطلب والاستجابة. ولكن ربما أحتاج أيضا إلى خصائص أخرى ومجموعات ... مثل الجلسة أو العناصر أو المستخدم ... إلخ.

هل كانت مفيدة؟

المحلول 2

غير ممكن

أعتقد أن الاستنساخ العميق الفعلي غير ممكن بسبب حالة جلسة الخادم. سيتعين على الاستنساخ أيضا استنساخ هذه القيمة، والتي هي مورد داخلي بخادم الويب المحدد غير المرئي ثابتا ولا يمكن استنساخه. في هذه الحالة، سيكون لدى خادم الويب كائنات جلسة متعددة على سبيل المثال.

الحل البديل
على أي حال. كان الحل البديل لتعيين قيم سياق إضافية قبل إنشاء منشأة تحكم الفرعية. بعد انتهاء المعالجة، عدت القيم إلى الأصل. لذلك لدي في الواقع سياق كما كان من قبل.

نصائح أخرى

في حين أن الإجابة "غير ممكن" هي صحيحة، فهناك بديل أكثر نظافة بكثير من القيم في السياق الحالي ثم إعادة كتابة إلى حالته الأصلية. الحل هو جعل كائن HttpContext جديد يعتمد بالكامل على عنوان URL من اختيارك.

// A new request/response is constructed to using a new URL.
// The new response is using a StreamWriter with null stream as a backing stream 
// which doesn't consume resources

using (var nullWriter = new StreamWriter(Stream.Null))
{
    var newRequestUri = new Uri("http://www.somewhere.com/some-resource/");
    var newRequest = new HttpRequest("", newRequestUri.ToString(), newRequestUri.Query);

    var newResponse = new HttpResponse(nullWriter);
    var newContext = new HttpContextWrapper(new HttpContext(newRequest, newResponse));

    // Work with the new context here before it is disposed...
} 

المرجعي: https://github.com/maartenba/mvcsitemprovider/34905271.

يجعل إطار ASP.NET MVC عمدا التبعيات في الفصول الدراسية المجردة مع جميع الأعضاء الظاهري. هذا ببساطة يقول - التسعة.

تعتمد وحدات التحكم على httpcontextbase، وليس httpcontext. ربما يمكنك جعل وحدات التحكم الفرعية الخاصة بك تعتمد على httpcontextbase أيضا حتى تتمكن من لفها. فقط 2 سنتات.

لقد استخدمت

<% Html.RenderAction("Action", "Controller"); %>

لتأثير كبير، مما يسمح لي بإنشاء إجراءات معزولة تماما / قادرة تماما دون اللجوء إلى التعليمات البرمجية المعقدة. هذا يبدو أنه يوفر نفس الوظيفة دون نفس التعقيد.

المشاهدات المقدمة هي وجهات نظر جزئية قياسية وإجراءات تحكم مثل أي شيء آخر.

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