我正和ASP.NET vNext一起在debian上试南希。我已经设置了一个示例项目,并让它与一个自托管的Owin应用程序一起工作。
Nancy似乎运行良好,但它正在寻找K运行时目录中的视图,Razor视图引擎不会加载。
K没有显示正在加载的Nancy.Viewengines.Razor,而是在project.json文件中。
这是我得到的错误:
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> .
我的project.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视图。
如何强迫Nancy查看正确的文件夹,以及如何加载Razor视图引擎?
这是我使用过的代码:https://github.com/matthijsbreemans/nancy-owin-vnext
发布于 2015-05-22 06:35:42
默认情况下,南希扫描AppDomain.CurrentDomain.BaseDirectory以查找程序集。在vNext中,程序集存储在单独的包中,而不是存储在bin目录中,因此它找不到Razor视图引擎。在完全支持可用之前,您可以实现自己的引导程序并覆盖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) }; }
}视图也存储在不同的目录中(特别是在发布时)。创建一个实现IRootPathProvider的新类,并返回IApplicationEnvironment.ApplicationBasePath。我已经通过将IApplicationEnvironment存储在一个静态变量中(南希中的IoC本身在引导程序中使用它时找不到实例)来完成这一工作(目前作为一种解决办法):
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());
}
}并实现南希的IRootPathProvider
public class vNextRootPathProvider : IRootPathProvider
{
private string BasePath = Startup.Environment.ApplicationBasePath;
public string GetRootPath()
{
return BasePath;
}
}发布于 2015-05-05 08:53:02
KRE找不到视图目录,您可以自定义Bootstrapper并重写IRootPathProvider,将根目录设置为绝对路径。看:https://github.com/NancyFx/Nancy/wiki/The-root-path
https://stackoverflow.com/questions/25492019
复制相似问题