如何在南希提供静态内容

时间:2012-11-07 12:50:46

标签: nancy

我在Nancy中提供JavaScript等静态内容时遇到了麻烦。

例如使用self hosting sample我已将一个test.js添加到Views文件夹并添加了

<script type="text/javascript" src="test.js"></script>

标记到staticview.html页面。如果我在浏览器中查看此页面,则JavaScript会正确执行。

然而,当我运行示例时,JavaScript不会被执行。如果我在FireBug中查看该页面,我发现我收到了test.js的404错误。

我尝试过添加

Get["{file}"] = p =>
{
    string path = string.Format("Views/{0}", p.file);
    return Response.AsJs(path);
};

当我设置一个断点并在即时窗口中执行Response.AsJs(path)时,我得到一个NotFound的StatusCode

我还尝试添加一个StaticContentConvention,例如

protected override void ConfigureConventions(NancyConventions conventions)
{
    base.ConfigureConventions(conventions);
    conventions.StaticContentsConventions.Add(
        StaticContentConventionBuilder.AddDirectory("/", "Views"));
    conventions.StaticContentsConventions.Add(
        StaticContentConventionBuilder.AddDirectory("Views", "Views"));
}

我做错了什么?

5 个答案:

答案 0 :(得分:37)

您可以使用NancyConventions配置静态内容。使用以下引导程序中的代码,您可以将所有静态内容(css / js / html / etc)放在应用程序根目录下名为“static”的文件夹中。

namespace Application
{
    public class ApplicationBootstrapper : DefaultNancyBootstrapper
    {
        protected override void ConfigureConventions(NancyConventions nancyConventions)
        {
            nancyConventions.StaticContentsConventions.Add(StaticContentConventionBuilder.AddDirectory("Static", @"Static"));
            base.ConfigureConventions(nancyConventions);
        }
    }
}

完成此操作后,您可以访问静态内容,例如脚本

<script type="text/javascript" src="/static/test.js"></script>

或css

<link rel="stylesheet" type="text/css" href="/static/styles.css">

答案 1 :(得分:28)

如果没有特殊原因,则无需配置任何约定。

  南希......是   附带一个默认约定,将在中查找文件   申请的content路径。

     

来自NancyFx | Managing static content

我通过这样做实现了同样的目标:

  1. 在名为“content”的项目中添加一个文件夹,在那里添加静态内容(.js,.xap,.ico,...)
  2. 对于每个内容文件,设置其属性:构建操作:嵌入式资源; 复制到输出目录:如果更新则复制。
  3. 更改路径以匹配新位置,例如:
  4. <script type="text/javascript" src="content/test.js"></script>

答案 2 :(得分:3)

仅为完整性而添加:如果您正好在自己的主机中运行Nancy并通过Visual Studio调试运行,并且您发现所有静态内容请求都获得了404,那么您必须确保构建操作设置为&#34;始终复制&#34;对于所有静态内容文件!

如果您不这样做,那么这些文件将不会被复制到您的输出目录,因此将不存在,因此404.

答案 3 :(得分:1)

对于自托管的Nancy应用,我认为您需要将这些文件标记为嵌入式资源 - 您可以为视图执行此操作。对于视图,您还需要在引导程序中执行此操作:

protected override NancyInternalConfiguration InternalConfiguration
{
  get
  {
    return NancyInternalConfiguration.WithOverrides(
      x => x.ViewLocationProvider = typeof (ResourceViewLocationProvider));
  }
}

你可能需要做类似的事情。

或者你应该(从内存中)使用.AsJsFile而不是.AsJs。

答案 4 :(得分:1)

首次在线分享解决方案。我花了4天的时间才找到一个快速的黑客,当我浏览教程和学习南希时,它会起作用。这是一个简单的解决方案:

确保你的project.json文件中有正确的设置:

"buildOptions": {
"emitEntryPoint": true,

"copyToOutput": [ "Views/Car/*" ]
},

接下来,转到CarModule.cs:

Get("/status", _ => View["Car"]);

第一次编译代码时,您的视图将起作用。但是,在您编辑html并尝试再次编译之后,您需要这个小小的黑客:

更改:

Get("/status", _ => View["Car"]);

到:

Get("/status", _ => View["Car.html"]);

我们欺骗编译器认为它需要将HTML附加到程序集。

我希望这可以帮助像我一样的noobs从NacyFx文档中直接从上述评论中获得很多工作意义。

相关问题