How to set default static web page for Katana/Owin self hosted app?

前端 未结 5 1741
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-29 07:34

I\'ve set up a web site using an Owin self hosted console app. I\'m serving static files with no problem, the \'root\' of the static part of the site works properly, and th

相关标签:
5条回答
  • 2020-12-29 07:39

    I do it this way:

    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);
    
    0 讨论(0)
  • 2020-12-29 07:43

    Maybe this late answer could help any other :) I just had the same problem with a SelfHost Owin app.

    The solution I found is implementing a class from IFileSystem interface that encapsulates a PhysicalFileSystem class (which also implements from 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);
        }
    }
    

    And in the app:

    var options = new FileServerOptions
    {
        EnableDefaultFiles = true,
        FileSystem = new WebPhysicalFileSystem("yourRoot");
    };
    
    0 讨论(0)
  • 2020-12-29 07:45

    In my case, I was missing the

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

    In system.webServer part of my web.config.

    0 讨论(0)
  • 2020-12-29 07:47

    a more detailed version of fra's answer:

    1- NuGet to install Microsoft.Owin.StaticFiles (I assumed you already installed Microsoft.AspNet.WebApi.OwinSelfHost via NuGet)

    2- Create a single directory in your solution (in Visual Studio), and put all your client files in it, e.g.

    +Web
    
    --+images
    
    --+pages
    
    ------page1
    
    ------page2
    
    --+scripts
    
    --+css
    
    ---index.html
    

    Note: there is a root directory (web) that contains all other directories, and the index.html under the root directly.

    3- Now, in the same class that contains your web api routing configuration, add the following code:

    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- One more step for the prev code to work: make sure to set the Copy to output directory property of all files in Web directory (and all nested directories) is set to Copy Always [select the file | press F4, or right-click then properties | go to Copy to output directory]

    That's all :)

    0 讨论(0)
  • 2020-12-29 07:51

    Maybe it's a late answer, but if you need just a default document, less code will work:

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

    It should be called before builder.UseStaticFiles for whatever reason.

    Version of Microsoft.Owin.StaticFiles is 3.0.1

    0 讨论(0)
提交回复
热议问题