Подтвердить что ты не робот

Как обслуживать статический контент в Нэнси

У меня возникли проблемы с обслуживанием статического контента, такого как JavaScript в Nancy.

Например, используя образец собственного хостинга, я добавил test.js в папку Views и добавил

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

на страницу staticview.html. Если я просмотрю эту страницу в браузере, JavaScript будет выполнен правильно.

Однако, когда я запускаю образец, JavaScript не выполняется. Если я просматриваю страницу в FireBug, я вижу, что я получаю ошибку 404 для test.js.

Я пробовал добавить

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

и когда я устанавливаю точку прерывания и выполняю Response.AsJs(путь) в непосредственном окне, я получаю StatusCode NotFound

Я также попытался добавить StaticContentConvention, например

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

Что я делаю неправильно?

4b9b3361

Ответ 1

Вы можете настроить статический контент с помощью 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">

Ответ 2

Вам не нужно настраивать какие-либо соглашения, если у вас нет особых причин.

Нэнси... поставляется с соглашением по умолчанию, которое будет искать файлы в content путь к вашему приложению.

Из NancyFx | Управление статическим контентом

Я сделал то же самое, просто сделав это:

  • Добавьте папку в проект под названием "контент", добавьте там статическое содержимое (.js,.xap,.ico,...)
  • Для каждого файла содержимого задайте его свойства: Build Action: Embedded Resources; Копировать в выходной каталог: копировать, если новый.
  • Измените пути, соответствующие новому местоположению, например:

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

Ответ 3

Добавление только для полноты: если вы запускаете Nancy в собственном хосте и запускаете визуальную отладку на студии, и вы обнаружите, что получаете 404 для всех статических запросов контента, вы должны убедиться, что действие сборки установлено на "Копировать всегда" для всех ваших статических файлов содержимого!

Если вы этого не сделаете, эти файлы не будут скопированы в ваш выходной каталог и поэтому не будут существовать, следовательно, 404.

Ответ 4

Для самостоятельного размещения приложения Nancy, я думаю, вам нужно пометить файлы как встроенные ресурсы - вы делаете для просмотров. Для просмотров вам также необходимо сделать это в своем загрузочном файле:

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

Вероятно, вам нужно что-то сделать.

В качестве альтернативы вы должны (из памяти) использовать .AsJsFile вместо .AsJs.

Ответ 5

Первый раз, когда вы делитесь решением онлайн. Мне потребовалось 4 дня, чтобы найти быстрый хак, который будет работать, когда я запускаю учебные пособия и изучаю Нэнси. Вот простое решение:

Убедитесь, что в файле project.json у вас есть правильная настройка:

"buildOptions": {
"emitEntryPoint": true,

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

Затем перейдите в свой CarModule.cs:

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

при компиляции кода в первый раз, когда ваш просмотр будет работать. Однако после того, как вы отредактируете html и попытаетесь скомпилировать его, вам понадобится этот небольшой взлом:

Изменить:

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

to:

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

Мы обманываем компилятор, чтобы думать, что ему нужно прикрепить HTML к сборке.

Я надеюсь, что это поможет noobs, таким как я, который не может сделать много работы из приведенных выше комментариев прямо из документации NacyFx.