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

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

Если я перехожу к:

http://localhost/index.html

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

http://localhost

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


person wilee    schedule 25.08.2014    source источник
comment
Можете ли вы показать нам свой файл Startup.cs?   -  person Rui    schedule 08.09.2014


Ответы (5)


Я делаю это так:

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);
person fra    schedule 24.10.2014
comment
Изменилось ли это с момента написания этого поста? У меня именно это, и хотя я могу перейти на http://localhost:5000/index.html и посмотреть страницу, если я просто зайду на http://localhost:5000, я просто получу 404. - person Eddie; 02.03.2015
comment
@Eddie, это работает со всеми последними версиями пакетов NuGet. Я думаю, вам просто нужно будет добавить правильный относительный путь к файлу для index.html. У меня это app/templates/index.html, и это работает, когда я в Chrome ввожу localhost:8080 :) - person JDTLH9; 17.03.2015
comment
@Eddie соедините вышеизложенное с тем, чтобы убедиться, что html-файл находится в месте сборки, установив для его свойства «Копировать в выходной каталог» значение «Копировать всегда» или «Копировать, если он новее». Жаль, что вы не получаете исключение, если файл не может быть найден!!! - person JDTLH9; 17.03.2015
comment
@ JDTLH9 Ах, относительный путь! Я просто писал index.html, думая, что он его найдет. Ваше здоровье - person Eddie; 17.03.2015
comment
Кажется, это не работает, если корень не находится прямо под текущим путем. Если, например, корневой путь равен ..\\web, ему удается обслуживать только документ по умолчанию, но все остальные ссылки (.js, .css и т. д.) возвращают 404, поскольку он пытается разрешить их ниже пути проекта, который определяет appBuilder... Странное поведение... - person Yngve B-Nilsen; 27.10.2015

более подробная версия ответа 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, добавьте следующий код:

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]

Это все :)

person Sameh Deabes    schedule 15.01.2015

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

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

Его следует вызывать перед builder.UseStaticFiles по любой причине.

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

person the_joric    schedule 06.09.2015
comment
Вы спасли мой день, позвонив UseDefaultFiles до того, как UseStaticFiles было ключом! - person Markus Wagner; 29.03.2016

Возможно, этот поздний ответ может помочь любому другому :) У меня была такая же проблема с приложением 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");
};
person SkwalieGator    schedule 24.07.2015
comment
это было очень полезно, я реализовал аналогичный класс, который будет сервером index.html, поэтому мой спа работает нормально, я хотел бы дать вам больше голосов. - person Alas; 31.07.2017

В моем случае мне не хватило

<handlers>
    <add name="AspNetStaticFileHandler" path="*" verb="*" type="System.Web.StaticFileHandler" />
</handlers>

В system.webServer часть моего web.config.

person Cubelaster    schedule 18.07.2018