如何为Katana / Owin自托管应用设置默认静态网页?

时间:2014-08-25 02:20:20

标签: asp.net owin katana self-hosting

我使用Owin自托管控制台应用程序设置了一个网站。我正在提供静态文件没有问题,网站静态部分的“根”正常工作,Web API路由也正常工作。

如果我浏览到:

http://localhost/index.html

它呈现了我期望的一切。但我还没弄清楚如何设置它以便浏览:

http://localhost

显示index.html(作为默认视图)。这是在IIS风格的网站下工作。如何使其与Owin自我主持人合作?

5 个答案:

答案 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部分中。