我有一个项目,需要从外部检索其托管的服务器上的文件本身.目前,我只是抓取一个Java脚本文件,但它最终会抓取其他东西.我try 在Program.cs中更改内容根路径来实现这一点,效果非常好.但我注意到,原始的指向Javascrip和css文件的相对链接仍然有效,没有任何更改.

例如,路径"~/css/site.css"仍然有效,尽管更改了内容根路径,并且没有告诉它专门在我的项目自己的wwwroot文件夹中查找.外部文件必须使用更具体的路径.例如:"~/some-other-project/wwwroot/js/myscripts.js".

现在,这一切都很好,实际上更倾向于行为,但我想知道why,它是这样工作的.项目是否先判断自己的wwwroot文件夹,然后再在内容根路径中指定的文件夹中查找其他位置?我想了解这背后的行为,这样我就可以更有信心地使用这种方法.

编辑: 以下是回购的例子:https://github.com/love-bird-13/Custom-Content-Path-Test 第一次提交只是设置了两个基本的.NET6项目,没有任何更改.第二个提交包含我为重现我所说的内容所做的所有更改.

推荐答案

关于你的问题

项目是否先判断自己的wwwroot文件夹,然后再在内容根路径中指定的文件夹中查找其他位置?

Serve files outside wwwroot by updating IWebHostEnvironment.WebRootPath主题具体如下.

如果将IWebHostEnvironment.WebRootPath设置为wwwroot以外的文件夹

  • development环境中,wwwroot和更新IWebHostEnvironment.WebRootPath中的静态assets资源 都从wwwroot提供服务.
  • 在除development之外的任何环境中,从更新的IWebHostEnvironment.WebRootPath文件夹中提供重复的静态资源.

因此,您描述的行为适用于development环境模式.

您将注意到,当环境变量为changing时,将ASPNETCORE_ENVIRONMENT环境变量设置为Development以外的值--这是开发时的默认设置--wwwroot中的文件将不再提供服务.


同一主题为下面的场景提供了一些方法.

  1. 如果您希望静态内容只从定制路径提供,而不是默认的wwwroot,那么最简单的方法可能就是删除那个wwwroot文件夹.

  2. 如果您想将wwwroot与自定义文件夹组合在一起,那么您可以在Program.cs中添加额外的app.UseStaticFiles;下面的Assets是一个包含一些静态文件的自定义文件夹,但它可以是任何可访问的绝对路径.

    app.UseStaticFiles();
    
    app.UseStaticFiles(new StaticFileOptions
    {
        FileProvider = new PhysicalFileProvider(
            Path.Combine(builder.Environment.ContentRootPath, "Assets")
            // Or some other absolute path. 
        )
    });
    

Asp.net相关问答推荐

502 DotNet WebApplication的网关nginx已损坏

如何在运行时判断动态数据类型的类型?

你能从请求变量中确定时区吗?

如何将配置转换应用于外部配置文件

Anti-Forgery Token 适用于不同的基于声明的用户

如何判断一个IP地址是否是私有的?

在 Asp.net 中通过 Button 的 CommandArgument 传递多个参数

将存储过程中 Select 查询的结果返回到列表

没有回发的按钮?

asp.net cookie、身份验证和会话超时

Windows 运行 ASP.NET 的 IIS 替代方案

反序列化客户端 AJAX JSON 日期

在 ApiController 中添加自定义响应头

如何从url中删除returnurl?

如何在我自己的方法中模仿 string.Format()?

如何进入 IIS 管理器?

在 ASP.NET 标识中添加角色

如何修复 ASP.NET 错误文件 'nnn.aspx' 尚未预编译,无法请求.?

ASP.NET 邮箱验证器正则表达式

Visual Studio 2013 ASP.NET 项目中 Antlr 包的用途是什么?