提供静态文件的 .NET Core Nancy 应用程序

.NET Core Nancy application serving static files

我正在尝试构建一个最小可行的网站作为 .NET Core 项目,使用 Nancy 和一些后端处理以及驻留在默认项目文件夹 wwwroot 中的静态文件作为前端。主要问题是我不明白如何让应用程序响应静态文件,因为默认约定不适用于新的 .NET Core 项目系统。

将 Nancy 应用程序构建为经典的 .NET Framework 应用程序已有详细记录,网络上有许多关于如何执行此操作的示例。但是 .NET Core 项目 (.xproj) 与经典的 .NET Framework 项目 (.csproj) 有很大不同。我很喜欢新的项目系统,但我不明白如何将Nancy部分集成到其中。并且缺少有关如何操作的文档和示例。

TL;DR: GitHub repository,其中包含所有需要的管道代码的演示项目。对于 Nancy v. 1.4.3 以及预发布 v. 2.0.0-barneyrubble。

支持 .NET Core 和 .NET Standard 的 Nancy v.2 仍处于预发布状态,因此即使您想坚持使用稳定的 v.1 分支 - 没问题。

这是从头开始的分步操作,对我有用:

1) 创建一个新的空 ASP.NET 核心 Web 应用程序

2) (如果您想坚持使用 Nancy v. 1,则必须执行此操作) 打开 project.json,删除 "Microsoft.NETCore.App" 依赖项并从中更改目标框架"netcoreapp1.0""net46",所以 frameworks 部分看起来像这样:

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

3) 将以下依赖项添加到project.json:"Microsoft.AspNetCore.Owin""Nancy"。在为 v.1 编写 project.json 的依赖项部分时:

"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) 创建一个 class 实现 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) 创建一个从DefaultNancyBootstrapper 派生的class,它将检索IHostingEnvironment 对象并将其传递给先前定义的Root Provider。它还将更改默认 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 class 并将 Configure 方法中的最后一行替换为此行:

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

它利用了上一步中创建的 Bootstrapper。

7) 现在是定义您的 NancyModule 的时候了。五、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 - 然后启动。