Как установить статическую статическую страницу для автономного приложения 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");
};