在我的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"
。 如何获得正确的方向?
答案 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.cs
从HostingEnvironment
设置基本路径
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)