C # /. NET Server Путь к странице по умолчанию / индекс - PullRequest
1 голос
/ 24 июня 2009

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

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

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

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

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

Спасибо за любую помощь, фураж

1 Ответ

5 голосов
/ 24 июня 2009

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 с частичным доверием (например, общий хостинг).

...