Directory.GetCurrentDirectory()没有返回正确的目录

时间:2019-02-03 23:46:56

标签: c# asp.net-core

在我的ASP.NET Core 2.2 MVC服务器中,我想添加一个文件夹来存储静态文件。我发现以下代码可以执行该操作:

app.UseStaticFiles(new StaticFileOptions {
    FileProvider = new PhysicalFileProvider(
        Path.Combine(Directory.GetCurrentDirectory(), "StaticFiles")),
    RequestPath = "/StaticFiles"
});

在我的计算机中,项目位于"C:\Users\MyUsername\source\repos\WebApplication1\WebApplication1"中,在同一目录中有一个名为“ StaticFiles”的文件夹和一个用于写入上面代码的Startup.cs文件。

但是当我执行代码时,出现以下错误:

'System.IO.DirectoryNotFoundException' in Microsoft.Extensions.FileProviders.Physical.dll C:\Program Files\IIS Express\StaticFiles\

Directory.GetCurrentDirectory()返回"C:\\Program Files\\IIS Express"而不是"C:\Users\MyUsername\source\repos\WebApplication1\WebApplication1"如何获得正确的方向?

3 个答案:

答案 0 :(得分:2)

IHostingEnvironment接口提供有关环境的信息,包括基本路径。您可以使用依赖注入获得实例。

public class Startup
{
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        // env.ContentRootPath;
    }
}

答案 1 :(得分:2)

这是 ASP.NET Core 2.2 中的一个错误,该错误已在GitHub中进行了报告,Microsoft ASP.NET Core团队已提供了以下解决方案,并将这些解决方案添加到ASP.NET Core的功能版本。

编写如下的帮助类:

public class CurrentDirectoryHelpers
{
    internal const string AspNetCoreModuleDll = "aspnetcorev2_inprocess.dll";

    [System.Runtime.InteropServices.DllImport("kernel32.dll")]
    private static extern IntPtr GetModuleHandle(string lpModuleName);

    [System.Runtime.InteropServices.DllImport(AspNetCoreModuleDll)]
    private static extern int http_get_application_properties(ref IISConfigurationData iiConfigData);

    [System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)]
    private struct IISConfigurationData
    {
        public IntPtr pNativeApplication;
        [System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.BStr)]
        public string pwzFullApplicationPath;
        [System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.BStr)]
        public string pwzVirtualApplicationPath;
        public bool fWindowsAuthEnabled;
        public bool fBasicAuthEnabled;
        public bool fAnonymousAuthEnable;
    }

    public static void SetCurrentDirectory()
    {
        try
        {
            // Check if physical path was provided by ANCM
            var sitePhysicalPath = Environment.GetEnvironmentVariable("ASPNETCORE_IIS_PHYSICAL_PATH");
            if (string.IsNullOrEmpty(sitePhysicalPath))
            {
                // Skip if not running ANCM InProcess
                if (GetModuleHandle(AspNetCoreModuleDll) == IntPtr.Zero)
                {
                    return;
                }

                IISConfigurationData configurationData = default(IISConfigurationData);
                if (http_get_application_properties(ref configurationData) != 0)
                {
                    return;
                }

                sitePhysicalPath = configurationData.pwzFullApplicationPath;
            }

            Environment.CurrentDirectory = sitePhysicalPath;
        }
        catch
        {
            // ignore
        }
    }
}

然后按如下所示在代码中调用SetCurrentDirectory()方法:

app.UseStaticFiles(new StaticFileOptions {
    FileProvider = new PhysicalFileProvider(

        CurrentDirectoryHelpers.SetCurrentDirectory(); // call it here

        Path.Combine(Directory.GetCurrentDirectory(), "StaticFiles")),
    RequestPath = "/StaticFiles"
});

现在一切正常!

答案 2 :(得分:0)

您的应用程序的默认工作目录似乎指向IIS Express的工作目录

首先尝试使用Program.csHostingEnvironment设置基本路径

  var builder = new ConfigurationBuilder()
      .SetBasePath(env.ContentRootPath)

如果这不起作用,最简单的选择是从launchSettings.json设置IIS Express启动配置文件的工作目录。为此,

  • 右键单击您的项目,然后选择属性。
  • 进入调试状态
  • 选择要使用的配置文件
  • 进入Working Directory文本框并设置您的工作目录

注意:这不会影响您的构建,它只是一个调试配置。


new HostBuilder()
    .CreateDefaultBuilder(args)
    .ConfigureAppConfiguration((context, builder) =>
    {               
         builder
            .SetBasePath(context.HostingEnvironment.ContentRootPath)