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
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);
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");
};
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.
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 :)
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