سؤال

في محاولة مني لمزيد من المستقبل واقية من مشروع أحاول العثور على أفضل طريقة لاسترداد المسار الكامل واسم صفحة الفهرس / الافتراضي في دليل الويب باستخدام C # و دون معرفة قائمة خادم الويب من الاحتمالات اسم الملف .

'Server.MapPath ( "/ اختبار /")' يعطيني 'C: \ شبكة الاتصالات العالمية \ الاختبار \'

... حتى لا: 'Server.MapPath (Page.ResolveUrl ( "/ اختبار /"))'

... ولكني في حاجة 'C: \ شبكة الاتصالات العالمية \ الاختبار \ index.html و".

لا أحد يعرف من وسيلة لاسترجاع القائمة اسم الملف أن خادم سيخدم حتى عندما يتصفح شخص ما إلى هذا الدليل - سواء كان ذلك default.aspx، أو index.html و، أو أيا كان

وشكرا على اي مساعدة، العلف

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

المحلول

وASP.NET ليس لديه علم بهذا. قد تحتاج إلى الاستعلام IIS لقائمة المستندات الافتراضية.

والسبب في ذلك هو أن IIS سوف ننظر في مجلد الويب الخاص بك لملف مطابقة الأول في القائمة المستند الافتراضي IIS ثم نسلمها إلى تمديد ISAPI مطابقة لهذا النوع من الملفات (بالتبعية) في تعيينات النصي.

لحصول على قائمة المستند الافتراضي يمكنك القيام بما يلي (باستخدام الموقع الافتراضي كمثال حيث عدد IIS = 1):

using System;
using System.DirectoryServices;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            using (DirectoryEntry w3svc =
                 new DirectoryEntry("IIS://Localhost/W3SVC/1/root"))
            {
                string[] defaultDocs =
                    w3svc.Properties["DefaultDoc"].Value.ToString().Split(',');

            }
        }
    }
}

ومن ثم يكون حالة من بالتكرار مجموعة defaultDocs لرؤية الملف الموجود في المجلد، في المباراة الأولى هي المستند الافتراضي. على سبيل المثال:

// Call me using: string doc = GetDefaultDocument("/");
public string GetDefaultDocument(string serverPath)
{

    using (DirectoryEntry w3svc =
         new DirectoryEntry("IIS://Localhost/W3SVC/1/root"))
    {
        string[] defaultDocs =
            w3svc.Properties["DefaultDoc"].Value.ToString().Split(',');

        string path = Server.MapPath(serverPath);

        foreach (string docName in defaultDocs)
        {
            if(File.Exists(Path.Combine(path, docName)))
            {
                Console.WriteLine("Default Doc is: " + docName);
                return docName;
            }
        }
        // No matching default document found
        return null;
    }
}

وسوف للأسف هذا لا يعمل إذا كنت في بيئة ASP.NET الثقة جزئية (مشتركة على سبيل المثال استضافة).

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