如何将路径与 WebRootPath 结合

Jac*_*jer 1 c# asp.net-core

我需要使用我的应用程序将一些文件上传到服务器,并且需要提供要保存文件的文件夹的完整路径。我正在使用Path.Combine带有webHostEnvironment.WebRootPath来自 appsettings.json 和文件名的附加文件夹路径的方法。代码如下所示:

var pathString = configuration.GetValue<string>("UploadPaths:Pictures");
var path = Path.Combine(webHostEnvironment.WebRootPath, pathString, picture.Name);
Run Code Online (Sandbox Code Playgroud)

问题是变量中的webHostEnvironment.WebRootPath只是省略了path(路径看起来像 pathString + picture.Name)。

知道如何获得正确的路径吗?

Sun*_*ule 6

如果您正在使用Asp.net核心3,然后用IWebHostEnvironment替代IHostingEnvironment。将 IWebHostEnvironment 作为依赖项注入依赖类。https://github.com/aspnet/AspNetCore/issues/7749

public class HomeController : Controller
{
    private readonly IWebHostEnvironment _webHostEnvironment;

    public HomeController(IWebHostEnvironment webHostEnvironment)
    {
        _webHostEnvironment= webHostEnvironment;
    }

    public IActionResult Index()
    {
        return Content(_webHostEnvironment.WebRootPath + "\n" + _webHostEnvironment.ContentRootPath);
    }
}
Run Code Online (Sandbox Code Playgroud)

当 Microsoft.Extensions.Hosting 在 2.1 中引入时,一些类型如 IHostingEnvironment 和 IApplicationLifetime 是从 Microsoft.AspNetCore.Hosting 复制的。一些 3.0 更改导致应用同时包含 Microsoft.Extensions.Hosting 和 Microsoft.AspNetCore.Hosting 命名空间。当引用两个命名空间时,对这些重复类型的任何使用都会导致“模糊引用”编译器错误。

此错误已在 3.0.0-preview3 中通过将以下类型标记为过时并用新类型替换它们来解决。新类型没有任何行为变化,只有命名。

Obsolete types (warning):

Microsoft.Extensions.Hosting.IHostingEnvironment
Microsoft.AspNetCore.Hosting.IHostingEnvironment
Microsoft.Extensions.Hosting.IApplicationLifetime
Microsoft.AspNetCore.Hosting.IApplicationLifetime
Microsoft.Extensions.Hosting.EnvironmentName
Microsoft.AspNetCore.Hosting.EnvironmentName

New types:

Microsoft.Extensions.Hosting.IHostEnvironment
Microsoft.AspNetCore.Hosting.IWebHostEnvironment : IHostEnvironment
Microsoft.Extensions.Hosting.IHostApplicationLifetime
Microsoft.Extensions.Hosting.Environments
Run Code Online (Sandbox Code Playgroud)

请注意,新的 IHostEnvironment IsDevelopment、IsProduction 等扩展方法位于 Microsoft.Extensions.Hosting 命名空间中,可能需要将其添加到您的应用中。

对于 3.0,新旧类型都可以从 HostBulder 和 WebHostBuilder 的依赖注入容器中获得。旧类型将在 4.0 中删除。


小智 1

您应该查看 的完整文档Path.Combine。可能会发生一些奇怪的事情。根据您所描述的内容,似乎pathString来自您的配置文件的根目录(即它不是相对路径)。

var path = Path.Combine("path1", "c:\path2", "path3");
// path is c:\path2\path3, since an argument with a root overrides any previous argument
Run Code Online (Sandbox Code Playgroud)