2016-11-29 6 views
5

Я пытаюсь создать минимально жизнеспособный веб-сайт в качестве проекта .NET Core с использованием Nancy с некоторыми backend-обработкой и статическими файлами в качестве интерфейса, который находится в папке проекта по умолчанию wwwroot. Основная проблема заключается в том, что я не понимаю, как заставить приложение отвечать статическими файлами, потому что соглашения по умолчанию не применяются к новой проектной системе .NET Core.Приложение .NET Core Nancy, работающее со статическими файлами

Построение приложений Nancy как классических приложений .NET Framework хорошо документировано, и в Интернете есть много примеров того, как это сделать. Но проекты .NET Core (.xproj) сильно отличаются от классических проектов .NET Framework (.csproj). Мне нравится новая система проекта, но я не понимаю, как интегрировать части Нэнси в нее. И есть недостаток документации и образцов о том, как это сделать.

ответ

7

TL; DR: GitHub repository, где находятся демонстрационные проекты со всем необходимым сантехническим кодом. Для Nancy v. 1.4.3, а также для предварительной проверки версии 2.0.0-barneyrubble.

Nancy v. 2, поддерживающий .NET Core и .NET Standard, все еще находится в предварительном состоянии, поэтому даже если вы хотите придерживаться стабильной ветви v. 1, не проблема.

Вот шаг шаг за того, как сделать это с нуля, который работал для меня:

1) Создайте новый пустой ASP.NET вку внутреннее полотно

2) (обязательно, если вы хотели бы придерживаться Нэнси против 1). Open project.json, удалить "Microsoft.NETCore.App" зависимость и изменение целевой базы от "netcoreapp1.0" до "net46", так frameworks раздел будет выглядеть так:

"frameworks": { 
    "net46": {} 
}, 

3) Добавьте следующие зависимости к project.json: "Microsoft.AspNetCore.Owin" и "Nancy". На момент написания раздела зависимостей project.json для V 1:.

"dependencies": { 
    // Ommited dependencies 
    "Microsoft.AspNetCore.Owin": "1.0.0", 
    "Nancy": "1.4.3" 
}, 

Для против 2:.

"dependencies": { 
    // Ommited dependencies 
    "Microsoft.AspNetCore.Owin": "1.0.0", 
    "Nancy": "2.0.0-barneyrubble" 
}, 

4) Создать класс, реализующий IRootPathProvider и указать путь к папке wwwroot (WebRootPath свойство) во время выполнения, используя IHostingEnvironment объект:

public class AppRootPathProvider : IRootPathProvider 
{ 
    private readonly IHostingEnvironment _environment; 

    public AppRootPathProvider(IHostingEnvironment environment) 
    { 
     _environment = environment; 
    } 
    public string GetRootPath() 
    { 
     return _environment.WebRootPath; 
    } 
} 

5) Создание переменного тока lass, полученный от DefaultNancyBootstrapper, который будет извлекать объект IHostingEnvironment и передать его ранее определенному корневому провайдеру. Она также будет меняться по умолчанию StaticContentsConventions с вашим собственным:

public class AppNancyBootstrapper : DefaultNancyBootstrapper 
{ 
    public AppNancyBootstrapper(IHostingEnvironment environment) 
    { 
     RootPathProvider = new AppRootPathProvider(environment); 
    } 

    protected override void ConfigureConventions(NancyConventions conventions) 
    { 
     base.ConfigureConventions(conventions); 

     conventions.StaticContentsConventions.AddDirectory("css"); 
     conventions.StaticContentsConventions.AddDirectory("js"); 
     conventions.StaticContentsConventions.AddDirectory("fonts"); 
    } 

    protected override IRootPathProvider RootPathProvider { get; } 
} 

6) Открыть Startup класс и заменить последнюю строку в Configure методом с этим:

app.UseOwin(x => x.UseNancy(options => options.Bootstrapper = new AppNancyBootstrapper(env))); 

Он использует Bootstrapper, созданный в предыдущем шаге.

7) Теперь пришло время определить ваш NancyModule. V.1:

public class AppNancyModule : NancyModule 
{ 
    public AppNancyModule() 
    { 
     Get["/"] = _ => View["index"]; 
     Get["/{fileName}"] = parameters => View[parameters.fileName]; 
    } 
} 

В. 2:

public class AppNancyModule : NancyModule 
{ 
    public AppNancyModule() 
    { 
     Get("/", _ => View["index"]); 
     Get("/{fileName}", parameters => View[parameters.fileName]); 
    } 
} 

И вы хорошо идти! Просто поместите свои статические файлы в wwwroot - и сработайте.