【问题标题】:How can I get access to the IWebHostEnvironment from within an ASP.NET Core 3 controller?如何从 ASP.NET Core 3 控制器中访问 IWebHostEnvironment?
【发布时间】:2020-04-05 20:48:29
【问题描述】:

我希望能够从控制器中的代码浏览 Web 根目录中的目录(例如我的 \img 目录或 \pdf 目录)。

我想使用类似下面的东西,其中envIWebHostEnvironment 的一个实例:

var provider = env.WebRootFileProvider;
var path = env.WebRootPath;

我不确定如何从控制器中获取IWebHostEnvironment 的实例。如何做到这一点?

【问题讨论】:

  • 我尝试从 startup.cs 中的配置创建环境的静态。但是,WebRootPath 为空。甚至可以从控制器访问根目录吗?
  • 不要那样做,使用依赖注入。如果你不知道那是什么,现在就去研究它。
  • 我确实使用了 DI,但 WebRootPath 和 WebRootFuleProvider 仍然为空。我摆脱了静电
  • 这没有意义,您需要向我们展示代码。

标签: c# asp.net-core


【解决方案1】:

您可以使用依赖注入将IWebHostEnvironment 实例注入您的控制器。在构造函数中:

public class MyController : Controller
{
    private readonly IWebHostEnvironment _env;
    public MyController(IWebHostEnvironment env)
    {
        _env = env;
    }
}

或在任何或控制器的方法中:

public class MyController : Controller
{
    [HttpGet]
    public IActionResult Me([FromServices] IWebHostEnvironment env)
    {
        return View();
    }
}

注意默认的WebRootFileProvider指向wwwroot文件夹,所以你需要确保它存在,否则你会得到一个NullFileProvider

【讨论】:

  • 这正是我所做的。我将“:IWebHostEnvironment env”放在控制器的构造函数中,并将 env 分配给一个私有变量。我可以确认 env 实际上是实例化的(不是空的),但是 WebRootFileProvider 和 WebRootPath 一样是空的。有趣的是 ContentRootPath 和 ContentRootFileProvider 不是空的和功能性的。为什么我无法访问 WebRoot?
  • 请注意,我使用的是IHostingEnvironment,而不是IWebHostEnvironment
  • 我确实注意到了。我也尝试过 IHostingEnvironment 并且 WebRootPath 和 WebRootFileProvider 都是空的。此外,我收到一条警告,说 IHostingEnvironment 将被弃用,建议使用 IWebHostEnvironment。不知道为什么为空。无需提供额外的代码,就是这样: var provider = _env.WebRootFileProvider; var path = _env.WebRootPath;
  • 对不起,IHostingEnvironment 用于 ASP.NET Core 2。奇怪的是,_env.WebRootFileProvidernull..
  • 好的,我终于重现了这个问题。您使用的 API 模板不会创建 wwwroot 文件夹,这就是您获得 NullFileProvider 的原因。如果您添加一个wwwroot 文件夹(可以为空),您将拥有一个PhysicalFileProvider
【解决方案2】:

如果有人正在寻找在 AspNetCore 环境(例如 NetStandard2.1 类库)之外使用 IWebHostEnvironment 的方法,只需将您的服务类配置为通用:

ServiceClass<THostEnvironment>(THostEnvironment hostEnvironment);

并从 AspNetCore 中调用它,例如:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddTransient<ServiceClass<IWebHostEnvironment>>();
        //... other service connections
    }

或者将其配置为在构造函数中使用 DependencyInjection:

How should I inject a DbContext instance into an IHostedService?

【讨论】:

    猜你喜欢
    • 2021-07-05
    • 2022-06-13
    • 2022-12-29
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多