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

Dei*_*lan 5 .net c# nancy .net-core

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

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

Dei*_*lan 7

TL; DR:GitHub存储库,其中包含所有需要的管道代码的演示项目所在.对于Nancy v.1.4.3以及对于预发布版本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": {}
},
Run Code Online (Sandbox Code Playgroud)

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

"dependencies": {
  // Ommited dependencies
  "Microsoft.AspNetCore.Owin": "1.0.0",
  "Nancy": "1.4.3"
},
Run Code Online (Sandbox Code Playgroud)

对于第2节:

"dependencies": {
  // Ommited dependencies
  "Microsoft.AspNetCore.Owin": "1.0.0",
  "Nancy": "2.0.0-barneyrubble"
},
Run Code Online (Sandbox Code Playgroud)

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

5)创建一个派生自的类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; }
}
Run Code Online (Sandbox Code Playgroud)

6)打开Startup类并用这个替换Configure方法中的最后一行:

app.UseOwin(x => x.UseNancy(options => options.Bootstrapper = new AppNancyBootstrapper(env)));
Run Code Online (Sandbox Code Playgroud)

它利用上一步中创建的Bootstrapper.

7)现在是时候定义你的了NancyModule.V. 1:

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

五.2:

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

你很高兴去!只需将静态文件放入wwwroot- 然后关闭即可.