我看到有一些方法可以获取应用程序文件夹路径:
Application.StartupPathSystem.IO.Path.GetDirectoryName(
System.Reflection.Assembly.GetExecutingAssembly().Location)AppDomain.CurrentDomain.BaseDirectorySystem.IO.Directory.GetCurrentDirectory()Environment.CurrentDirectorySystem.IO.Path.GetDirectoryName(
System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)System.IO.Path.GetDirectory(Application.ExecutablePath)取决于具体情况,最好的方法是什么?
我将项目更新为.NETCORE v3.0.0-preview3,现在得到:
Startup.cs(75,50,75,69):警告CS0618:'IHostingEnvironment'已过时:'此类型已过时,将在以后的版本中删除。推荐的替代方法是Microsoft.AspNetCore.Hosting.IWebHostEnvironment。
代码是:
public void Configure(IApplicationBuilder app, IHostingEnvironment env) {
if (env.IsDevelopment()) {
...
Run Code Online (Sandbox Code Playgroud)
现在正确的方法是什么?是否有任何文档/示例来显示?
SetBasePath用于进程内托管的正确参数是什么?
我们以这种方式设置配置:
private static IConfiguration Configuration { get; } = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false)
.Build();
Run Code Online (Sandbox Code Playgroud)
但是,使用ASP.NET Core 2.2进程内托管时,Directory.GetCurrentDirectory()将返回C:\Program Files\IIS Express而不是我的应用程序根目录。
编辑:
我正在初始化我的配置,Program.Main以便按照示例阅读设置以传递给Serilog 。
回答:
可悲的是,这个问题被标记为重复,因此在问题中回答。
这个问题在这里讨论。在下一次ASP.NET Core更新中,GetCurrentDirectory将提供与进程外托管相同的值。同时,提供以下代码作为解决方法。
using System;
namespace SampleApp
{
internal 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 …Run Code Online (Sandbox Code Playgroud) 在我的 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"。我怎样才能得到正确的方向?
我希望能够从控制器中的代码浏览 Web 根目录中的目录(例如我的 \img 目录或 \pdf 目录)。
我想使用以下内容,其中env是一个实例IWebHostEnvironment:
var provider = env.WebRootFileProvider;
var path = env.WebRootPath;
Run Code Online (Sandbox Code Playgroud)
我不确定如何IWebHostEnvironment从控制器中获取 的实例。如何才能做到这一点?
为什么我的以下代码有时有效,但有时却无效?
private bool UploadFile(IFormFile ufile, string fname)
{
if (ufile.Length > 0)
{
string fullpath = Path.Combine(_env.WebRootPath, fname);
using (var fileStream = new FileStream(fullpath, FileMode.Create))
{
ufile.CopyToAsync(fileStream);
}
return true;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
代码确实设法将图片保存到我在下创建的文件夹中wwwroot,但是图片没有出现,甚至在Visual Studio中也没有出现。
有办法解决吗?
谢谢。
即使打开存储图片的文件夹的文件浏览器,图片也好像在那里但没有显示任何图像。