hostfile.json webroot属性不提供静态文件

时间:2016-06-02 04:37:18

标签: asp.net-core

坚果: - )

我安装了最新的ASP.NET Core(RC2)。

我希望能够创建一个*.sln,其中包含多个*.csproj:一个用于服务器端开发,一个用于客户端开发。

我们将它们分开的原因是我们可以选择将客户端*.csproj提供给具有更好UI技能的外部开发人员,而无需了解服务器端代码。他们可以使用Visual Studio Code或其他轻量级IDE在客户端html / js上工作,而不需要Visual Studio参与。

在客户端*.csproj中,我想从根目录为角度项目提供静态文件(html / js / css),而不是从 wwwroot提供目录,以便gulpfile.js相对路径等与没有Visual Studio的角度项目设置相同。

据我了解,规则现在是:  *如果hosting.json文件存在,则使用hosting.json中的webroot设置。  *否则,请使用wwwroot。  *如果缺少,请使用root。  *请参阅:Effective Java Item 29: Consider typesafe heterogeneous containers

首先,检查我是否设置了静态页面路由。创建了一个wwwroot / index.html页面。田田!的工作原理。

现在,将目录重命名为app/并更新hosting.json以指向它。重新加载项目后,app/文件夹更改了图标...好...运行...没有快乐。与它战斗一段时间。没有成功......

然后完全删除app/文件夹和hosting.json文件。最终肯定想扔东西......

我获取静态文件的唯一方法是调用该文件夹wwwroot。我是否有hosting.json文件。

这与以下文档相反:https://github.com/aspnet/Hosting/issues/450

还有其他人成功摆脱了wwwroot文件夹吗?如果是这样......怎么样?!?!?

谢谢!

1 个答案:

答案 0 :(得分:1)

虽然可以打开ASP.NET核心应用程序的根目录来提供静态文件,但这不是一个好主意,因为一旦你这样做,就没有任何阻止某人从导航到project.json或根目录中的任何其他文件。

话虽如此,这里是你如何在wwwroot之外提供静态文件。

首先,创建一个返回IApplicationBuilder的静态类。在这里,您将定义可访问的物理路径以及该路径的可选URL重写(请参阅代码中的注释):

using System.IO;

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting.Internal;
using Microsoft.Extensions.FileProviders;

public static class ApplicationBuilderExtensions
{
    public static IApplicationBuilder UseRootResources(this IApplicationBuilder app, HostingEnvironment env)
    {
        //var path = Path.Combine(env.ContentRootPath); // WARNING - this opens up the root of the app
        var path = Path.Combine(env.ContentRootPath, "static"); // this would allow for serving up contents in a physical path folder named 'static'
        var provider = new PhysicalFileProvider(path);

        var options = new StaticFileOptions();
        // the below line re-writes the path name of the physical path, it can have the string value of anything you want to call it
        options.RequestPath = ""; //  in this example, an empty string will give the *appearance* of it being served up from the root
        //options.RequestPath = "/static"; // this will use the URL path named static, but could be any made-up name you want
        options.FileProvider = provider;

        app.UseStaticFiles(options);
        return app;
    }
}

接下来,在Startup.cs中,从Configure方法调用该函数:

app.UseRootResources((HostingEnvironment)env);

现在您可以在wwwroot之外提供静态文件了!在HTML中引用静态文件将使用您在ApplicationBuilderExtensions类中设置的Options.RequestPath中定义的路径。假设您将RequestPath留给空字符串来模拟根,那么您可以调用它所在的资源(即使它真的存在于' static'文件夹中),这要归功于URL重写的神奇之处:

<img src="bus.jpg"/>