我使用Owin自托管控制台应用程序设置了一个网站。我正在提供静态文件没有问题,网站静态部分的“根”正常工作,Web API路由也正常工作。
如果我浏览到:
http://localhost/index.html
它呈现了我期望的一切。但我还没弄清楚如何设置它以便浏览:
http://localhost
显示index.html(作为默认视图)。这是在IIS风格的网站下工作。如何使其与Owin自我主持人合作?
答案 0 :(得分:21)
fra的答案的更详细版本:
1- NuGet安装Microsoft.Owin.StaticFiles(我假设你已经通过NuGet安装了Microsoft.AspNet.WebApi.OwinSelfHost)
2-在解决方案中创建一个目录(在Visual Studio中),并将所有客户端文件放入其中,例如。
+Web
--+images
--+pages
------page1
------page2
--+scripts
--+css
---index.html
注意:有一个根目录(web),它包含所有其他目录,以及根目录下的index.html。
3-现在,在包含Web 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- prev代码的另一个步骤:确保将Web目录中的所有文件的Copy to output directory
属性(以及所有嵌套目录)设置为Copy Always
[选择文件|按F4,或右键单击属性|转到Copy to output directory
]
全部:)
答案 1 :(得分:19)
我是这样做的:
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 :(得分:7)
也许这是一个迟到的答案,但如果你只需要一个默认文档,那么代码就会少一些:
builder.UseDefaultFiles(new DefaultFilesOptions
{
DefaultFileNames = Enumerable.Repeat("index.html", 1).ToList()
});
无论出于何种原因,都应该在builder.UseStaticFiles
之前调用它。
Microsoft.Owin.StaticFiles
的版本是3.0.1
答案 3 :(得分:3)
也许迟到答案可以帮助其他任何人:) 我在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");
};
答案 4 :(得分:1)
就我而言,我错过了
<handlers>
<add name="AspNetStaticFileHandler" path="*" verb="*" type="System.Web.StaticFileHandler" />
</handlers>
在我的web.config的system.webServer部分中。