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

End*_*ook 5 c# asp.net-core

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

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

在我的电脑中,该项目位于"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\
Run Code Online (Sandbox Code Playgroud)

Directory.GetCurrentDirectory()正在恢复"C:\\Program Files\\IIS Express",而不是"C:\Users\MyUsername\source\repos\WebApplication1\WebApplication1"我怎样才能得到正确的方向?

Tan*_*jel 3

这是ASP.NET Core 2.2中的一个错误,已在GitHub中报告,微软 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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

        CurrentDirectoryHelpers.SetCurrentDirectory(); // call it here

        Path.Combine(Directory.GetCurrentDirectory(), "StaticFiles")),
    RequestPath = "/StaticFiles"
});
Run Code Online (Sandbox Code Playgroud)

现在一切都应该正常了!


归档时间:

查看次数:

11309 次

最近记录:

6 年,11 月 前