web-dev-qa-db-ja.com

ナンシーで静的コンテンツを提供する方法

NancyでJavaScriptなどの静的コンテンツを提供するのに問題があります。

たとえば セルフホスティングサンプル を使用して、Viewsフォルダーにtest.jsを追加し、

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

何が悪いのですか?

28
Ian Oakes

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">
37

特別な理由がない場合は、規則を設定する必要はありません。

Nancy ...は、アプリケーションのcontentパスでファイルを検索するデフォルトの規則で出荷されます。

From NancyFx |静的コンテンツの管理

私はこれを行うだけで同じことを達成しました:

  1. 「content」という名前のプロジェクトにフォルダーを追加し、そこに静的コンテンツを追加します(.js、.xap、.icoなど)。
  2. 各コンテンツファイルについて、そのプロパティを設定します。ビルドアクション:埋め込みリソース; 出力ディレクトリにコピー:新しい場合はコピーします。
  3. 新しい場所に一致するようにパスを変更します。次に例を示します。

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

30
JOG

完全を期すために追加:ナンシーをセルフホストで実行していて、ビジュアルスタジオのデバッグを介して実行していて、すべての静的コンテンツリクエストに対して404を取得している場合は、ビルドアクションが「常にコピー」に設定されていることを確認する必要があります。 "すべての静的コンテンツファイルに対して!

これを行わない場合、これらのファイルは出力ディレクトリにコピーされないため、存在しないため、404になります。

4
tom redfern

初めてオンラインでソリューションを共有する。チュートリアルを実行してナンシーを学ぶのに役立つ簡単なハックを見つけるのに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をアセンブリーに添付する必要があると考えます。

これが、NacyFxのドキュメントから直接の上記のコメントからはあまり機能しない私のような初心者に役立つことを願っています。

1
BlackFox

自己ホスト型のNancyアプリの場合、ファイルを埋め込みリソースとしてマークする必要があると思います。ビューの場合は、ブートストラップでもこれを行う必要があります。

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

おそらく同じようなことをする必要があります。

または、(メモリから).AsJsの代わりに.AsJsFileを使用する必要があります。

1