Вопрос

Пытаясь продвинуть проект на будущее, я пытаюсь найти наилучший способ получения полного пути и имени файла страницы index / default в веб-каталоге с использованием C # и не зная списка возможностей файла для веб-сервера. .

«Server.MapPath (" / test / ")» дает мне «C: \ www \ test \»

... так же: 'Server.MapPath (Page.ResolveUrl (" / test / ")) "

... но мне нужно "C: \ www \ test \ index.html".

Кто-нибудь знает о существующем методе получения имени файла, которое веб-сервер будет использовать, когда кто-нибудь просматривает этот каталог - будь то default.aspx, index.html или что-то еще?

Спасибо за любую помощь, кормовая

Это было полезно?

Решение

ASP.NET не знает об этом. Вам нужно будет запросить IIS для списка документов по умолчанию.

Причиной этого является то, что IIS будет искать в вашей веб-папке первый соответствующий файл в списке документов IIS по умолчанию, а затем передавать соответствие соответствующему расширению ISAPI для этого типа файла (по расширению) в сопоставлениях сценариев.

Чтобы получить список документов по умолчанию, вы можете сделать следующее (используя веб-сайт по умолчанию в качестве примера, где IIS Number = 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