nombre - Cómo servir contenido estático en Nancy
nancy nombre (5)
Tengo problemas para mostrar contenido estático como JavaScript en Nancy.
Por ejemplo, utilizando el ejemplo de alojamiento automático , he agregado un test.js a la carpeta de Vistas y he agregado un
<script type="text/javascript" src="test.js"></script>
etiqueta a la página staticview.html. Si veo esta página en el navegador, el JavaScript se ejecuta correctamente.
Sin embargo, cuando ejecuto la muestra, el JavaScript no se ejecuta. Si veo la página en FireBug, veo que aparece un error 404 para test.js.
He intentado agregar
Get["{file}"] = p =>
{
string path = string.Format("Views/{0}", p.file);
return Response.AsJs(path);
};
y cuando establezco un punto de interrupción y ejecuto Response.AsJs (ruta) en la ventana inmediata obtengo un StatusCode de NotFound
También he intentado agregar un StaticContentConvention como
protected override void ConfigureConventions(NancyConventions conventions)
{
base.ConfigureConventions(conventions);
conventions.StaticContentsConventions.Add(
StaticContentConventionBuilder.AddDirectory("/", "Views"));
conventions.StaticContentsConventions.Add(
StaticContentConventionBuilder.AddDirectory("Views", "Views"));
}
¿Qué estoy haciendo mal?
Agregando solo para completar: si está ejecutando a Nancy en auto host y ejecutando a través de la depuración de Visual Studio, y descubre que está recibiendo 404 para todas las solicitudes de contenido estático, debe asegurarse de que la acción de compilación esté configurada en "Copiar siempre "para todos tus archivos de contenido estático!
Si no hace esto, estos archivos no se copiarán en el directorio de salida y, por lo tanto, no existirán, por lo tanto, 404.
No tiene que configurar ninguna convención si no tiene motivos especiales.
Nancy ... se entrega con una convención predeterminada que buscará archivos en la ruta de
content
de su aplicación.
Logré lo mismo haciendo esto:
- Agregue una carpeta en el proyecto llamada "contenido", agregue los contenidos estáticos allí (.js, .xap, .ico, ...)
- Para cada archivo de contenido, establezca sus propiedades: Acción de compilación : Recursos incrustados; Copiar en el directorio de salida : Copiar si es más nuevo.
- Cambie las rutas para que coincidan con la nueva ubicación, por ejemplo:
<script type="text/javascript" src="content/test.js"></script>
Para una aplicación de Nancy auto hospedada, creo que necesita marcar los archivos como recursos incrustados, lo hace para las vistas. Para las vistas, también debe hacer esto en su bootstrapper:
protected override NancyInternalConfiguration InternalConfiguration
{
get
{
return NancyInternalConfiguration.WithOverrides(
x => x.ViewLocationProvider = typeof (ResourceViewLocationProvider));
}
}
Probablemente tengas que hacer algo similar.
Alternativamente, debe (desde la memoria) usar .AsJsFile en lugar de .AsJs.
Primera vez cada compartiendo una solución en línea. Tardé 4 días en encontrar un truco rápido que funcionaría a medida que realizaba los tutoriales y aprendía nancy. Aquí está la solución fácil:
Asegúrese de tener en su archivo project.json la configuración correcta:
"buildOptions": {
"emitEntryPoint": true,
"copyToOutput": [ "Views/Car/*" ]
},
A continuación, vaya a su CarModule.cs:
Get("/status", _ => View["Car"]);
cuando compile el código por primera vez, su vista funcionará. Sin embargo, después de editar el html e intentar compilar nuevamente, necesitas este pequeño truco:
Cambio:
Get("/status", _ => View["Car"]);
a:
Get("/status", _ => View["Car.html"]);
Engañamos al compilador para que piense que necesita adjuntar el HTML al ensamblaje.
Espero que esto ayude a los noobs como yo que no tienen mucho sentido para el trabajo a partir de los comentarios anteriores directamente de la documentación de NacyFx.
Puedes configurar contenido estático usando NancyConventions
. Usando el código del siguiente bootstrapper, puede colocar todos sus contenidos estáticos (css / js / html / etc) dentro de una carpeta llamada "static" en la raíz de su aplicación.
namespace Application
{
public class ApplicationBootstrapper : DefaultNancyBootstrapper
{
protected override void ConfigureConventions(NancyConventions nancyConventions)
{
nancyConventions.StaticContentsConventions.Add(StaticContentConventionBuilder.AddDirectory("Static", @"Static"));
base.ConfigureConventions(nancyConventions);
}
}
}
Una vez hecho esto, puede acceder a contenido estático como scripts
<script type="text/javascript" src="/static/test.js"></script>
o css
<link rel="stylesheet" type="text/css" href="/static/styles.css">