asp.net - encontró - owin mvc
¿Cómo configurar la página web estática predeterminada para la aplicación auto hospedada de Katana/Owin? (5)
He configurado un sitio web utilizando una aplicación de consola auto hospedada de Owin. Estoy sirviendo archivos estáticos sin problemas, la ''raíz'' de la parte estática del sitio funciona correctamente y las rutas de API web también funcionan bien.
Si busco a:
http://localhost/index.html
Presenta todo como espero. Pero no he descubierto cómo configurarlo para que la navegación a:
http://localhost
presenta index.html (como la vista por defecto). Esto solo funciona bajo un sitio de estilo IIS. ¿Cómo puedo hacer que funcione con Owin?
En mi caso, me faltaba el
<handlers>
<add name="AspNetStaticFileHandler" path="*" verb="*" type="System.Web.StaticFileHandler" />
</handlers>
En la parte system.webServer de mi web.config.
Lo hago de esta manera:
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);
Tal vez esta respuesta tardía podría ayudar a cualquier otra :) Acabo de tener el mismo problema con una aplicación SelfHost Owin.
La solución que encontré es implementar una clase desde la interfaz de IFileSystem que encapsula una clase PhysicalFileSystem (que también se implementa desde 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);
}
}
Y en la aplicación:
var options = new FileServerOptions
{
EnableDefaultFiles = true,
FileSystem = new WebPhysicalFileSystem("yourRoot");
};
Tal vez sea una respuesta tardía, pero si necesita solo un documento predeterminado, funcionará menos código:
builder.UseDefaultFiles(new DefaultFilesOptions
{
DefaultFileNames = Enumerable.Repeat("index.html", 1).ToList()
});
Debe llamarse antes que builder.UseStaticFiles
por cualquier motivo.
La versión de Microsoft.Owin.StaticFiles
es 3.0.1
Una versión más detallada de la respuesta de fra:
1- NuGet para instalar Microsoft.Owin.StaticFiles (asumí que ya instaló Microsoft.AspNet.WebApi.OwinSelfHost a través de NuGet)
2- Cree un directorio único en su solución (en Visual Studio), y coloque todos los archivos de sus clientes en él, por ejemplo
+Web
--+images
--+pages
------page1
------page2
--+scripts
--+css
---index.html
Nota: hay un directorio raíz (web) que contiene todos los demás directorios, y el index.html debajo de la raíz directamente.
3- Ahora, en la misma clase que contiene la configuración de enrutamiento de su API web, agregue el siguiente código:
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- Un paso más para que funcione el código anterior: asegúrese de configurar la propiedad Copy to output directory
de todos los archivos en el directorio web (y todos los directorios anidados) está configurado en Copy Always
[seleccione el archivo | presione F4, o haga clic derecho y luego propiedades | vaya a Copy to output directory
]
Eso es todo :)