مشاكل في التحميل على خادم الإنتاج ولكن ليس في التطوير

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

  •  22-07-2019
  •  | 
  •  

سؤال

ربما سؤال بسيط لكنني حقًا لا أعرف ماذا أفعل.

عندما أقوم بإرسال ملف من خلال نموذج باستخدام <asp:FileUpload>, ، إنه يعمل بشكل مثالي على جهاز التطوير الخاص بي.

عندما أحاول نفس الشيء على الخادم، فإنه يعطيني الخطأ أدناه.الخطأ لا يساعدني على الإطلاق لأنه ليس لدي حتى هذه الوظيفة في الكود الخاص بي (CaptureCollection) وليس لدي متغير يسمى "i".حتى الآن، أنا حقا لا أعرف.

هل هذه مسألة تتعلق بالحق على الخادم (لا أعتقد ذلك لأنني أعطي جميع الحقوق الممكنة والخطأ لا يزال موجودًا)، هل هذا شيء موجود في الكود الخاص بي (لكنه يعمل على جهاز التطوير الخاص بي...).يمكنني إظهار المزيد من التعليمات البرمجية إذا كنت بحاجة!

الخطأ:

Server Error in '/' Application.
--------------------------------------------------------------------------------

Specified argument was out of the range of valid values.
Parameter name: i 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values.
Parameter name: i

Source Error: 

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.  

Stack Trace: 


[ArgumentOutOfRangeException: Specified argument was out of the range of valid values.
Parameter name: i]
   System.Text.RegularExpressions.CaptureCollection.GetCapture(Int32 i) +5227599
   System.Text.RegularExpressions.CaptureCollection.get_Item(Int32 i) +4
   CreatePost.btnFinish_Click(Object sender, EventArgs e) +143
   System.EventHandler.Invoke(Object sender, EventArgs e) +0
   System.Web.UI.WebControls.Button.OnClick(EventArgs e) +111
   System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +110
   System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10
   System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13
   System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +36
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1565

وإليكم الكود الذي يقوم بعملية التحميلوربما كنت على حق مع regex.ولكن لماذا يعمل على التطوير وليس على المنتج؟

protected void btnFinish_Click(object sender, EventArgs e)
{
    string file = "";
    string csFinalPath = "";

    if (uploadPhoto.HasFile)
    {
        string filepath = uploadPhoto.PostedFile.FileName;
        string pat = @"\\(?:.+)\\(.+)\.(.+)";
        Regex r = new Regex(pat);

        //run
        Match m = r.Match(filepath);
        string file_ext = m.Groups[2].Captures[0].ToString();
        string filename = m.Groups[1].Captures[0].ToString();
        file = filename + "." + file_ext;

        //save the file to the server 
        uploadPhoto.PostedFile.SaveAs(Server.MapPath(".\\upload\\") + file);

        ThumbnailGenerator thumbGenerator = new ThumbnailGenerator();

        if (thumbGenerator.GetThumbnail(Server.MapPath(".\\upload\\") + file,
        Server.MapPath(".\\upload\\thumb\\") + "Thumb" + file))
        {
            csFinalPath = "./upload/thumb/" + "Thumb" + file;
        }
        else
        {
            //TODO: Do an error message!!!
        }
    }
    else
    {
        csFinalPath = "./images/no_image.gif";
    }

    m_database.InsertPost(Convert.ToInt32(Session["ID"].ToString()),
        Convert.ToInt32(ddlCategory.SelectedValue),
        m_nType,
        txtLink.Text,
        txtTitreFR.Text,
        txtTitreEN.Text,
        txtDescriptionFR.Text,
        txtDescriptionEN.Text,
        csFinalPath,
        "",
        "");

    panelLink.Visible = false;
    panelResult.Visible = true;

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

المحلول

ستحتاج إلى نشر الرمز الخاص بك، ولكن للحصول على لقطة في الظلام...

في طريقة btnFinish_Click على صفحتك، هناك خطأ ما في المكان الذي تحاول فيه استخدام التعبير العادي.

على الأرجح أنك قد التقطت مجموعة من مطابقات RegEx وحاولت تعدادها، في حين أنه لا يوجد أي منها بالفعل.(أو لديك حلقة For تمر عبر عناصر أكثر مما تحتويه المجموعة/القائمة بالفعل.)

يحرر: أنا متأكد بنسبة 99% أنه بعد هنا:

Match m = r.Match(filepath);

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

if (m.Groups.Count == 0) { DoSomethingElseHere(); }

ثم تحقق مما إذا كان هناك أي التقاطات في تلك المجموعة:

if (m.Groups[0].Captures.Count == 0) { DoSomethingElseHere(); }

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

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

أيضًا، إذا كنت تستخدم عنصر تحكم في التحميل، فلن تمر جميع المتصفحات في مسار UNC الكامل إلى الملف (أي.\server\share\file.ext) - يقوم البعض بتمرير اسم الملف من تلقاء نفسه، لذا فهذه بعض الأشياء التي يجب التحقق منها.

نصائح أخرى

<اقتباس فقرة>   

وstring file_ext = m.Groups[2].Captures[0].ToString(); string filename = m.Groups[1].Captures[0].ToString();

والتعليمات البرمجية يفترض وجود مجموعات. لسبب ما (بصراحة ليس لدي أي التعابير المنطقية فو) لا يحصلون على أن المجموعات التي تعتقد وجود دائما على الإنتاج. فما استقاموا لكم فاستقيموا التأكد هنا هو م، هناك m.Groups وm.Groups.Count> = 2 وm.Groups [] لديه يلتقط قبل استدعاء تلك الأساليب.

وربما بيئة الإنتاج تضع الملفات في موقع مختلف. في محاولة للتحقق ما مجلد يضع خادم الإنتاج ملفاته وحيث تطور لا. يحدث هذه القضايا بشكل متكرر عند تطوير ويعيش تستخدم أنظمة تشغيل مختلفة أو إصدارات IIS مختلفة. ربما الفرق في موقع التخزين يسبب فشل بك ريج السابقين. أنا لست مؤيد رجإكس لذلك أنا لا أعرف ما إذا التعابير المنطقية الخاصة بك قد يحتوي على خطأ، ولكن هذا هو الشيء الأول الذي كنت أفكر فيه.

وكما هو DEV الجهاز الخاص بك؟ في هذه الحالة: هل تستخدم IIS أو الذي تستخدمه خادم تطوير ASP.NET؟ لأن IIS وخادم تطوير ASP.NET المتكاملة في Visual Studio تتصرف مختلفة في حالات معينة.

وأيضا: مباشرة "القفز إلى" الممارسات السيئة يعتبر موقع مجموعة من العديد من المطورين (وأعتقد أيضا أنها ليست جيدة جدا للقفز فقط في مجموعة افتراض المبلغ الصحيح من العناصر هناك). خاصة عند استخدام المصفوفات متعددة الأبعاد فإنه يمكن الحصول صعبة عندما تحدث أخطاء. لقد رأيت الكثير من كود معقد فشلها في الفهارس مجموعة وبسبب عدم وجود شيكات كان من الصعب جدا لتصحيح لهم (انا اتحدث عن 5 أو 6 صفائف البعد).

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