web-dev-qa-db-fra.com

Comment définir une page Web statique par défaut pour l'application auto-hébergée Katana/Owin?

J'ai créé un site Web à l'aide d'une application console auto-hébergée Owin. Je sers des fichiers statiques sans aucun problème, la "racine" de la partie statique du site fonctionne correctement et les itinéraires de l'API Web fonctionnent également correctement.

Si je navigue vers:

http://localhost/index.html

il présente tout comme je l'espère. Mais je n'ai pas compris comment le configurer pour que la navigation à:

http://localhost

presents index.html (en tant que vue par défaut). Cela fonctionne simplement sous un site de style IIS. Comment puis-je le faire fonctionner avec Owin Self Host?

16
wilee

Je le fais de cette façon:

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);
19
fra

une version plus détaillée de la réponse de fra:

1- NuGet pour installer Microsoft.Owin.StaticFiles (j'ai supposé que vous aviez déjà installé Microsoft.AspNet.WebApi.OwinSelfHost via NuGet)

2- Créez un seul répertoire dans votre solution (dans Visual Studio) et mettez-y tous vos fichiers client, par exemple.

+Web

--+images

--+pages

------page1

------page2

--+scripts

--+css

---index.html

Remarque: il existe un répertoire racine (Web) contenant tous les autres répertoires, ainsi que le fichier index.html directement sous la racine.

3- Maintenant, dans la même classe que celle qui contient votre configuration de routage d'api web, ajoutez le code suivant:

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- Une étape supplémentaire pour que le code précédent fonctionne: assurez-vous de définir la propriété Copy to output directory de tous les fichiers du répertoire Web (et de tous les répertoires imbriqués) est définie sur Copy Always [sélectionnez le fichier | appuyez sur F4 ou cliquez avec le bouton droit de la souris sur propriétés | aller à Copy to output directory]

C'est tout :)

21
Sameh Deabes

C'est peut-être une réponse tardive, mais si vous avez juste besoin d'un document par défaut, moins de code fonctionnera:

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

Il devrait être appelé avant builder.UseStaticFiles pour une raison quelconque.

La version de Microsoft.Owin.StaticFiles est 3.0.1

7
the_joric

Peut être ça en retard réponse pourrait aider tout autre :) J'ai juste eu le même problème avec une application SelfHost Owin.

La solution que j'ai trouvée implémente une classe de l'interface IFileSystem qui encapsule une classe PhysicalFileSystem (qui implémente également de 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);
    }
}

Et dans l'application:

var options = new FileServerOptions
{
    EnableDefaultFiles = true,
    FileSystem = new WebPhysicalFileSystem("yourRoot");
};
3
SkwalieGator

Dans mon cas, il me manquait le

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

Dans la partie system.webServer de mon web.config.

1
Cubelaster