نشر النماذج إلى 404 + HttpHandler في IIS7:لماذا اختفت جميع بيانات POST؟

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

  •  01-07-2019
  •  | 
  •  

سؤال

حسنًا، قد يبدو هذا مربكًا ومعقدًا بعض الشيء، لذا تحملني.

لقد كتبنا إطارًا يسمح لنا بتحديد عناوين URL المألوفة.إذا قمت بالتصفح إلى أي عنوان URL عشوائي، فسيحاول IIS عرض الخطأ 404 (أو، في بعض الحالات، 403؛14 أو 405).ومع ذلك، تم إعداد IIS بحيث يتم إرسال أي شيء موجه إلى تلك الأخطاء المحددة إلى ملف .aspx.يتيح لنا ذلك تنفيذ HttpHandler للتعامل مع الطلب والقيام بالأشياء، والتي تتضمن العثور على القالب المرتبط ثم تنفيذ كل ما يرتبط به.

الآن، كل هذا يعمل في IIS 5 و6، وإلى حد ما، في IIS7 - ولكن لمصيدة واحدة، والتي تحدث عندما تقوم بنشر نموذج.

انظر، عندما تقوم بنشر نموذج على عنوان URL غير موجود، يقول IIS "آه، ولكن عنوان url هذا غير موجود" ويلقي خطأ 405 "الطريقة غير مسموح بها".نظرًا لأننا نطلب من IIS إعادة توجيه هذه الأخطاء إلى صفحة .aspx الخاصة بنا وبالتالي التعامل معها باستخدام HttpHandler، فلا يمثل هذا عادةً مشكلة.ولكن اعتبارًا من IIS7، اختفت جميع معلومات POST بعد إعادة توجيهها إلى 405.وبالتالي لم يعد بإمكانك القيام بأتفه الأشياء التي تنطوي على النماذج.

لحل هذه المشكلة، حاولنا استخدام HttpModule، الذي يحافظ على بيانات POST ولكن يبدو أنه لا يحتوي على جلسة عمل تمت تهيئتها في الوقت المناسب (عند الحاجة إليها).لقد حاولنا أيضًا استخدام HttpModule لجميع الطلبات، وليس فقط الطلبات المفقودة التي تصل إلى 404/403؛14/405، ولكن هذا يعني أن أشياء مثل الصور وcss وjs وما إلى ذلك يتم التعامل معها بواسطة كود .NET، وهو أمر غير فعال إلى حد كبير.

وهو ما يقودني إلى السؤال الفعلي:هل واجه أي شخص هذا من قبل، وهل لدى أي شخص أي نصيحة أو يعرف ما يجب فعله لإعادة الأمور إلى طبيعتها؟حتى الآن اقترح أحد الأشخاص استخدام برنامج Microsoft الخاص وحدة إعادة كتابة URL.هل سيساعد هذا في حل مشكلتنا؟

شكرًا.

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

المحلول

أصدرت Microsoft إصلاحًا عاجلاً لهذا:

http://support.microsoft.com/default.aspx/kb/956578

نصائح أخرى

نظرًا لأن IIS7 يستخدم .net من الأعلى إلى الأسفل، فلن يكون هناك أي حمل إضافي للأداء باستخدام HttpModule، في الواقع هناك العديد من وحدات HttpModules المُدارة التي يتم استخدامها دائمًا في كل طلب.عندما يتم إطلاق حدث BeginRequest، ربما لم تتم إضافة SessionStateModule إلى مجموعة الوحدات، لذلك إذا حاولت التعامل مع الطلب أثناء هذا الحدث، فلن تتوفر معلومات حالة الجلسة.سيؤدي تعيين الخاصية HttpContext.Handler إلى تهيئة حالة الجلسة إذا كان المعالج المطلوب يحتاج إليها، لذا يمكنك فقط تعيين المعالج على صفحة 404 الرائعة التي تطبق IRequiresSessionState.من المفترض أن تؤدي التعليمات البرمجية أدناه المهمة، على الرغم من أنك قد تحتاج إلى كتابة تطبيق مختلف للطريقة IsMissing():

using System.Web;
using System.Web.UI;

class Smart404Module : IHttpModule
{
    public void Dispose() {}

    public void Init(HttpApplication context)
    {
        context.BeginRequest += new System.EventHandler(DoMapping);
    }

    void DoMapping(object sender, System.EventArgs e)
    {
        HttpApplication app = (HttpApplication)sender;

        if (IsMissing(app.Context))
            app.Context.Handler = PageParser.GetCompiledPageInstance(
                "~/404.aspx", app.Request.MapPath("~/404.aspx"), app.Context);
    }

    bool IsMissing(HttpContext context)
    {
        string path = context.Request.MapPath(context.Request.Url.AbsolutePath);

        if (System.IO.File.Exists(path) || (System.IO.Directory.Exists(path)
            && System.IO.File.Exists(System.IO.Path.Combine(path, "default.aspx"))))
            return true;
        return false;
    }
}

يحرر:أضفت تطبيق IsMissing()

ملحوظة:في IIS7، لا تعمل وحدة حالة الجلسة بشكل افتراضي عالميًا.هناك خياران:قم بتمكين وحدة حالة الجلسة لجميع الطلبات (راجع تعليقي أعلاه فيما يتعلق بتشغيل الوحدات النمطية المُدارة لجميع أنواع الطلبات)، أو يمكنك استخدام الانعكاس للوصول إلى الأعضاء الداخليين داخل System.Web.dll.

تم إصلاح المشكلة في IIS 7 المتمثلة في عدم تمرير متغيرات النشر إلى معالجات الأخطاء المخصصة في حزمة الخدمة 2 لنظام التشغيل Vista.لم أجربه على Windows Server ولكني متأكد من أنه سيتم إصلاحه هناك أيضًا.

مجرد تخمين:المعالج المحدد في %windir%\system32\inetsrv\config\applicationhost.config الخاص بـ IIS7 والذي يتعامل مع طلبك لا يسمح لفعل POST بالمرور على الإطلاق، ويقوم بتقييم هذه القاعدة قبل تحديد ما إذا كان عنوان URL غير موجود أم لا .

نعم، أوصي بالتأكيد بإعادة كتابة عنوان URL (باستخدام IIS7 من Microsoft كأحد البدائل العديدة).تم تصميم هذا خصيصًا لتوفير عناوين URL سهلة الاستخدام، في حين أن مستندات الأخطاء هي بمثابة مساندة أخيرة للفشل، مما يؤدي إلى تشويش البيانات الواردة بحيث قد لا تكون كما تتوقع.

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