Как установить статическую статическую страницу для автономного приложения Katana/Owin?

Я создал веб-сайт с помощью собственного консольного приложения Owin. Я обслуживаю статические файлы без проблем, "корень" статической части сайта работает правильно, а маршруты веб-API также отлично работают.

Если я просматриваю:

http://localhost/index.html

он представляет все, как я ожидаю. Но я не понял, как установить его так, чтобы просмотр:

http://localhost

представляет index.html(как вид по умолчанию). Это просто работает под сайтом в стиле IIS. Как заставить его работать с автономным хостом Owin?

Ответы

Ответ 1

Я делаю так:

var physicalFileSystem = new PhysicalFileSystem(webPath);
var options = new FileServerOptions
                          {
                              EnableDefaultFiles = true,
                              FileSystem = physicalFileSystem
                          };
        options.StaticFileOptions.FileSystem = physicalFileSystem;
        options.StaticFileOptions.ServeUnknownFileTypes = true;
        options.DefaultFilesOptions.DefaultFileNames = new[] { "index.html" };
        appBuilder.UseFileServer(options);

Ответ 2

более подробная версия ответа fra:

1- NuGet для установки Microsoft.Owin.StaticFiles(я предположил, что вы уже установили Microsoft.AspNet.WebApi.OwinSelfHost через NuGet)

2- Создайте единый каталог в своем решении (в Visual Studio) и поместите в него все ваши клиентские файлы, например

+Web

--+images

--+pages

------page1

------page2

--+scripts

--+css

---index.html

Примечание. Существует корневой каталог (веб-сайт), который содержит все остальные каталоги, а index.html непосредственно под корнем.

3 Теперь, в том же классе, который содержит вашу конфигурацию веб-api routing, добавьте следующий код:

var physicalFileSystem = new PhysicalFileSystem(@".\Web"); //. = root, Web = your physical directory that contains all other static content, see prev step
var options = new FileServerOptions
{
    EnableDefaultFiles = true,
    FileSystem = physicalFileSystem
 };
 options.StaticFileOptions.FileSystem = physicalFileSystem;
 options.StaticFileOptions.ServeUnknownFileTypes = true;
 options.DefaultFilesOptions.DefaultFileNames = new[] { "index.html" }; //put whatever default pages you like here
 appBuilder.UseFileServer(options);

4- Еще один шаг для работы предыдущего кода: убедитесь, что для свойства Copy to output directory всех файлов в веб-каталоге (и всех вложенных каталогах) установлено значение Copy Always [выберите файл | нажмите F4 или щелкните правой кнопкой мыши, затем свойства | перейдите к Copy to output directory]

Что все:)

Ответ 3

Возможно, это поздний ответ, но если вам нужен только документ по умолчанию, меньше кода будет работать:

builder.UseDefaultFiles(new DefaultFilesOptions
{
    DefaultFileNames = Enumerable.Repeat("index.html", 1).ToList()
});

Он должен быть вызван до builder.UseStaticFiles по какой-либо причине.

Версия Microsoft.Owin.StaticFiles - 3.0.1

Ответ 4

Возможно, этот ответ late может помочь любому другому:) У меня была такая же проблема с приложением SelfHost Owin.

Я нашел решение, реализующее класс из интерфейса IFileSystem, который инкапсулирует класс PhysicalFileSystem (который также реализуется из IFileSystem).

public class WebPhysicalFileSystem : IFileSystem
{
    private PhysicalFileSystem InnerFileSystem { get; set; }
    private string Default { get; set; }

    public WebPhysicalFileSystem(string root, string defaultFile = "index.html")
    {
        InnerFileSystem = new PhysicalFileSystem(root);
        Default = defaultFile;
    }

    public bool TryGetDirectoryContents(string subpath, out IEnumerable<IFileInfo> contents)
    {
        if(InnerFileSystem.TryGetDirectoryContents(subpath, out contents))
        {
            return true;
        }

        string defaultPath = System.IO.Path.Combine(InnerFileSystem.Root, Default);
        return InnerFileSystem.TryGetDirectoryContents(defaultPath, out contents);
    }

    public bool TryGetFileInfo(string subpath, out IFileInfo fileInfo)
    {
        if (InnerFileSystem.TryGetFileInfo(subpath, out fileInfo))
        {
            return true;
        }

        string defaultPath = System.IO.Path.Combine(InnerFileSystem.Root, Default);
        return InnerFileSystem.TryGetFileInfo(defaultPath, out fileInfo);
    }
}

И в приложении:

var options = new FileServerOptions
{
    EnableDefaultFiles = true,
    FileSystem = new WebPhysicalFileSystem("yourRoot");
};