我正在 debian 上尝试使用 Nancy 和 ASP.NET vNext。我已经设置了一个示例项目,并让它与自托管的 Owin 应用程序一起使用。
Nancy 本身似乎运行良好,但它正在 K 运行时目录中查找 View ,并且 Razor View 引擎无法加载。
尽管 Nancy.Viewengines.Razor 位于 project.json 文件中,但 K 并未显示正在加载的 Nancy.Viewengines.Razor
这是我收到的错误:
Nancy.RequestExecutionException: Oh noes! ---> Nancy.ViewEngines.ViewNotFoundException: Unable to locate view 'ViewTest'
Currently available view engine extensions: sshtml,html,htm
Locations inspected: views/Home/ViewTest-nl-NL,views/Home/ViewTest,Home/ViewTest-nl-NL,Home/ViewTest,views/ViewTest-nl-NL,views/ViewTest,ViewTest-nl-NL,ViewTest
Root path: /home/vnext/.kre/packages/KRE-mono45-x86.1.0.0-alpha3/bin/
If you were expecting raw data back, make sure you set the 'Accept'-header of the request to correct format, for example 'application/json' at Nancy.ViewEngines.DefaultViewFactory.GetRenderedView (string,object,Nancy.ViewEngines.ViewLocationContext) <0x008a3>
.
我的项目.json:
{
"dependencies": {
"Microsoft.Owin.Hosting": "2.1.0-*",
"Microsoft.Owin.Hosting": "2.1.0-*",
"Microsoft.Owin.Host.HttpListener": "2.1.0-*",
"Nancy": "0.23.2-*",
"Nancy.Owin": "0.23.2-*",
"Nancy.Viewengines.Razor": "0.23.2-*",
},
}
加载的库:
vnext@vnext:~/test/src$ k run
/home/vnext/.kre/packages/KRE-mono45-x86.1.0.0-alpha3/bin/klr.host.dll Information : 0 : [LoaderContainer]: Load name=Microsoft.Owin.Host.HttpListener
/home/vnext/.kre/packages/KRE-mono45-x86.1.0.0-alpha3/bin/klr.host.dll Information : 0 : [DefaultLoaderEngine]: LoadFile(/home/vnext/.kpm/packages/Microsoft.Owin.Host.HttpListener/2.1.0/lib/net45/Microsoft.Owin.Host.HttpListener.dll)
/home/vnext/.kre/packages/KRE-mono45-x86.1.0.0-alpha3/bin/klr.host.dll Information : 0 : [NuGetAssemblyLoader]: Loaded name=Microsoft.Owin.Host.HttpListener in 1ms
/home/vnext/.kre/packages/KRE-mono45-x86.1.0.0-alpha3/bin/klr.host.dll Information : 0 : [LoaderContainer]: Load name=Nancy.Owin
/home/vnext/.kre/packages/KRE-mono45-x86.1.0.0-alpha3/bin/klr.host.dll Information : 0 : [DefaultLoaderEngine]: LoadFile(/home/vnext/.kpm/packages/Nancy.Owin/0.23.2/lib/net40/Nancy.Owin.dll)
/home/vnext/.kre/packages/KRE-mono45-x86.1.0.0-alpha3/bin/klr.host.dll Information : 0 : [NuGetAssemblyLoader]: Loaded name=Nancy.Owin in 1ms
当我将其放入 KRE bin 目录而不是项目的 View 文件夹中时,它将加载普通的 html View 。
如何强制 Nancy 查看正确的文件夹,以及如何加载 Razor View 引擎?
这是我使用过的代码:https://github.com/matthijsbreemans/nancy-owin-vnext
最佳答案
南希扫描AppDomain.CurrentDomain.BaseDirectory
默认情况下用于程序集。在 vNext 中,程序集存储在单独的包中,而不是 bin 目录中,因此它无法找到 Razor View 引擎。在获得全面支持之前,您可以实现自己的 Bootstrap 并覆盖 ViewEngines 列表:
protected override void ConfigureApplicationContainer(TinyIoCContainer container)
{
base.ConfigureApplicationContainer(container);
container.Register<IViewEngine, Nancy.ViewEngines.Razor.RazorViewEngine>();
container.Register<Nancy.ViewEngines.Razor.IRazorConfiguration, Nancy. ViewEngines.Razor.DefaultRazorConfiguration>();
}
protected override IEnumerable<Type> ViewEngines
{
get { return new[] { typeof(Nancy.ViewEngines.Razor.RazorViewEngine) }; }
}
View 也存储在不同的目录中(尤其是发布时)。创建一个实现 IRootPathProvider
的新类,并返回 IApplicationEnvironment.ApplicationBasePath
。我已经通过将 IApplicationEnvironment 存储在静态变量中来完成此操作(目前作为解决方法)(Nancy 中的 IoC 本身在 Bootstrap 中使用它时找不到实例):
public class Startup
{
internal static IApplicationEnvironment Environment { get; private set; }
public Startup(IApplicationEnvironment env)
{
Environment = env;
}
public void ConfigureServices(IServiceCollection services) { }
public void Configure(IApplicationBuilder app)
{
app.UseOwin(a => a.UseNancy());
}
}
并实现 Nancy 的 IRootPathProvider
:
public class vNextRootPathProvider : IRootPathProvider
{
private string BasePath = Startup.Environment.ApplicationBasePath;
public string GetRootPath()
{
return BasePath;
}
}
关于razor - ASP.NET vNext 上的 Nancy 不加载 Nancy.Viewengines.Razor viewengine,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25492019/