如何使用IHostBuilder获得运行应用程序的绝对路径



我已经为自定义记录器创建了一个类库,并使用IHostBuilder上的扩展方法将记录器注册到windowsweb application。我想在Program.cs文件存在的目录中创建"Log"文件夹(如果不存在)。使用console application,我可以使用相对路径directory . createdirectory (@"...... log ")创建目录,它在所需的位置创建目录。然而,当我的记录器与WebApp注册时,它会在"F:LogsCsvILogger.csv"中创建目录。

public static IHostBuilder RegisterMyLoggerWithDefaultSettings(this IHostBuilder builder)
{
//How can I get absolute path of program.cs file here with web application?
}

如何获得"program.cs"文件夹的路径?文件存在时,我的记录器注册到WebApplication?

我从这篇文章中得到了解决方案的想法:从服务中删除特定的日志提供者

注意:为了获得Webroot路径,我使用反射来提取属性值,因为我不想在这个扩展方法所在的类库中添加对Asp.Net core library的引用。我只在我的类库中添加了Microsoft.Extensions.Hosting的包引用。

public static IHostBuilder FindApplicationPath(this IHostBuilder builder)
{
builder.ConfigureLogging((context, loggingBuilder) =>
{
var serviceDescriptor = loggingBuilder.Services.Where(x => x.ImplementationInstance != null && x.ServiceType.FullName == "Microsoft.AspNetCore.Hosting.IWebHostEnvironment").FirstOrDefault();
string appPath;
if (serviceDescriptor != null)
{
//application is web application
appPath = serviceDescriptor.ImplementationInstance
.GetType()
.GetProperty("WebRootPath")
.GetValue(serviceDescriptor.ImplementationInstance, null)
.ToString();
//code to use path
}
else
{
serviceDescriptor = loggingBuilder.Services
.Where(x => x.ImplementationInstance != null && 
x.ServiceType == typeof(Microsoft.Extensions.Hosting.IHostEnvironment))
.FirstOrDefault();
var hostingEnvironment = (Microsoft.Extensions.Hosting.Internal.HostingEnvironment)serviceDescriptor.ImplementationInstance;
appPath = hostingEnvironment.ContentRootPath;

//code to use path
}
}
);
return builder;
}

输出:

web:

Z: Folder1 Folder2 MyWebApp wwwroot

控制台应用:

Z: MyConsoleApp bin 调试 net6.0

相关内容

  • 没有找到相关文章

最新更新