如何在ASP.NET 4.5项目中使用wwwroot文件夹(ASP.NET 5样式)?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (43)

我非常喜欢新的asp.net(asp.net 5 \ core 1.0)web应用程序的方法,其中wwwroot文件夹是根目录,并且只有静态文件被提供。

有可能通过路由或其他配置在asp.net 4.5项目中有一个wwwroot文件夹以类似的方式运行,这样静态文件只能提供它,并且它是静态文件的webapp的“根”?

(我问这个动机的部分原因是我在VS2015的asp.net 5项目中有一个角色应用程序,但我需要将其移入一个asp.net 4.5项目,但希望将现有结构保留在磁盘上)

尝试使用OWIN

我尝试过使用空的ASP.NET 4.5 Web应用程序项目和OWIN。所以我的文件夹结构有我的角度应用程序,在项目文件夹的wwwroot文件夹中有一个主index.html文件。项目的根目录中没有HTML文件。

我已经通过nuget和下面的启动文件添加了OWIN:

[assembly: OwinStartup(typeof(MyApp.UI.Startup))]
namespace MyApp.UI
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            string root = AppDomain.CurrentDomain.BaseDirectory;
            var physicalFileSystem = new PhysicalFileSystem(Path.Combine(root, "wwwroot"));
            var options = new FileServerOptions
            {
                EnableDefaultFiles = true,
                FileSystem = physicalFileSystem
            };
            options.StaticFileOptions.FileSystem = physicalFileSystem;
            options.StaticFileOptions.ServeUnknownFileTypes = false;
            options.DefaultFilesOptions.DefaultFileNames = new[] {"index.html"};
            app.UseFileServer(options);
        }
    }
}

这虽然失败了 - 当我运行它时,我的index.html文件的源代码会加载,但它引用的所有css,js等文件都会以404失败。更糟糕的是,如果我将gulpfile.js附加到根网址上,从项目文件夹的根目录加载我的gulp文件。这正是我想要避免的事情。

有任何想法吗?

提问于
用户回答回答于

我相信我现在有一个可行的方法来做到这一点。进行了一些Google搜索和实验,但最终我提出了以下过程:

  1. 在VS2015中创建一个新的ASP.NET 4.5项目,选择空模板
  2. 通过nuget(Install-Package Microsoft.Owin.Host.SystemWebMicrosoft.Owin.StaticFiles)添加OWIN引用
  3. 添加一个类似于以下的启动文件: [assembly: OwinStartup(typeof(MyApp.Startup))] namespace MyApp.UI { public class Startup { public void Configuration(IAppBuilder app) { string root = AppDomain.CurrentDomain.BaseDirectory; var physicalFileSystem = new PhysicalFileSystem(Path.Combine(root, "wwwroot")); var options = new FileServerOptions { RequestPath = PathString.Empty, EnableDefaultFiles = true, FileSystem = physicalFileSystem }; options.StaticFileOptions.FileSystem = physicalFileSystem; options.StaticFileOptions.ServeUnknownFileTypes = false; app.UseFileServer(options); } } }
  4. 将以下内容添加到web.config文件中,以防止IIS提供您不想要的静态文件,并强制所有内容通过OWIN管道: <system.webServer> <handlers> <remove name="StaticFile"/> <add name="Owin" verb="" path="*" type="Microsoft.Owin.Host.SystemWeb.OwinHttpHandler, Microsoft.Owin.Host.SystemWeb"/> </handlers> </system.webServer>

对于如何做到这一点,我总是乐于提供更好的建议,但这至少似乎对我有用。

用户回答回答于

尽管OWIN在VS 2017中运行的开发环境中为我工作,但一旦部署到Azure后,它就无法工作。我们也运行一个SPA,并且将存储在〜/ wwwroot /中的webpack输出,但希望它加载,就像它在项目根目录〜/就像.net core webapi一样。我通过使用下面显示的URL重写来完成它:

<system.webServer>
<rewrite>
  <rules>
    <rule name="wwwRootFix" stopProcessing="true">
      <match url="(.*)" />
      <conditions logicalGrouping="MatchAll">
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
        <add input="{APPL_PHYSICAL_PATH}wwwroot\{R:1}" matchType="IsFile" />
        <add input="{REQUEST_URI}" pattern="^/(api)" negate="true" />
        <add input="{REQUEST_URI}" pattern="^/(wwwroot)" negate="true" />
      </conditions>
      <action type="Redirect" url="/wwwroot/{R:1}" />
    </rule>
    <rule name="React Routes" stopProcessing="true">
      <match url=".*" />
      <conditions logicalGrouping="MatchAll">
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
        <add input="{REQUEST_URI}" pattern="^/(api)" negate="true" />
        <add input="{REQUEST_URI}" pattern="^/(wwwroot)" negate="true" />
      </conditions>
      <action type="Rewrite" url="/wwwroot/index.html" />
    </rule>
  </rules>
</rewrite>
</system.webServer>

第一条规则确保要查找的文件不存在于根目录中,不是文件夹,在新路径中找到,不是wwwroot文件夹,也不是api的一部分。如果满足所有这些条件,它会尝试从wwwroot加载数据。

第二个规则检查以确保您没有尝试加载api或实际存在于根目录中的文件。如果两个条件均满足,则加载默认的SPA html文档(在我们的例子中,我们使用react)。

实际上,这允许在上述所有其他条件未能找到匹配之后,反应路由器4处理所有其他路由,并且使得它在尝试加载其中一个反应路由器路由时不会引发404错误。

扫码关注云+社区