提供静态文件的 .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
- 然后启动。
我正在尝试构建一个最小可行的网站作为 .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
- 然后启动。