هل يتصرف Server.mappath بشكل مختلف في جهاز الجهاز والخادم المحلي؟

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

  •  01-10-2019
  •  | 
  •  

سؤال

لقد عانيت من كابوس حقيقي مع Server.MapPath(). عندما أتصل Server.MapPath("~") في طلبي الذي يتم تشغيله في خادم تطوير ASP.NET ، يقوم بإرجاع دليل الجذر الذي ينتهي في ظهور خلفي مثل f:\projects\app1\, ، لكني أسميها في الإصدار المنشور ، مثبتًا في IIS ، فإنه يعيد دليل الجذر دون أي مقطع خلفي مثل c:\inetpub\wwwroot\app1. لماذا يحدث هذا؟ كيف يمكن تجنب؟

قمت بإجراء سيناريوهين على نفس الجهاز: Windows Server 2008 R2 X64 ، Visual Studio 2010 X64 ، IIS 7.

تحديث:

لماذا أهتم به؟ ineed لقد كتبت موفر خريطة موقع مخصص بناءً على بنية الملف/المجلد. يستخرج قائمة ملف/مجلدات دليل الجذر "~", ، يحل محل قسم دليل الجذر مع Server.MapPath("~") من أجل إنشاء عنوان URL .aspx ملفات للاستخدام في ASP.NET Menu مراقبة. أعتقد أن الكود التالي يشرح ما أفعله:

    string mainRoot = HttpContext.Current.Server.MapPath("~");

    DirectoryInfo di = new DirectoryInfo(mainRoot); 

    //added to solve this problem with Server.MapPath
    if (!mainRoot.EndsWith(@"\"))
        mainRoot += @"\";


    FileInfo[] files = di.GetFiles("*.aspx");
    foreach (FileInfo item in files)
    {
        string path = item.FullName.Replace(mainRoot, "~/").Replace(@"\", "/");

        //do more here
    }
هل كانت مفيدة؟

المحلول

يمكن أن يكون من عند إعداد الدليل الظاهري داخل IIS ، اعتمادًا على ما إذا كنت قد استخدمت مائلة زائدة عند إعداده.

لكن هل من المهم حقًا؟ لماذا حتى تهتم ماذا Server.MapPath("~") عائدات؟ لا أستطيع أن أتخيل أنك ستستخدمها تمامًا مثل هذا. على الأرجح هو عندما تحتاج فعليًا إلى طريق إلى شيء ما داخل طلبك:

Server.MapPath("~/Something/Foo.txt");

بالإضافة إلى ذلك ، كلما قمت ببناء المسارات ، يجب أن تحاول الدخول path.combine, ، لأنك لا داعي للقلق بشأن التخفيف من القطع على الإطلاق:

string fullPath = Path.Combine(Server.MapPath("~"), @"Something\Foo.txt");
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top