【问题标题】:Nancy on ASP.NET vNext does not load the Nancy.Viewengines.Razor viewengineASP.NET vNext 上的 Nancy 不加载 Nancy.Viewengines.Razor 视图引擎
【发布时间】:2014-10-18 23:08:25
【问题描述】:

我正在 debian 上使用 ASP.NET vNext 尝试 Nancy。我已经设置了一个示例项目,并让它与一个自托管的 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> .

我的项目.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

【问题讨论】:

    标签: razor nancy asp.net-core


    【解决方案1】:

    Nancy 默认扫描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 存储在静态变量中(在引导程序中使用时,Nancy 中的 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;
        }
    }
    

    【讨论】:

      【解决方案2】:

      KRE 找不到 views 目录,你可以自定义 Bootstrapper 并覆盖 IRootPathProvider ,将根目录设置为绝对路径。看:https://github.com/NancyFx/Nancy/wiki/The-root-path

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-13
        相关资源
        最近更新 更多