هل يتصرف Server.mappath بشكل مختلف في جهاز الجهاز والخادم المحلي؟
-
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");