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

时间:2016-11-29 16:15:57

标签: c# .net .net-core nancy

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

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

1 个答案:

答案 0 :(得分: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核心Web应用程序

2)(如果你想坚持Nancy v.1,必须提供)打开project.json,删除"Microsoft.NETCore.App"依赖关系,并从"netcoreapp1.0"更改目标框架到"net46",所以frameworks部分看起来像这样:

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

3)将以下依赖项添加到project.json:"Microsoft.AspNetCore.Owin""Nancy"。在为{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)创建一个实现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的类,它将检索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类,用{1}}方法替换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中 - 然后关闭。