gpt4 book ai didi

c# - IHostingEnvironment.ContentRootPath 如何设置?

转载 作者:行者123 更新时间:2023-11-30 21:28:59 26 4
gpt4 key购买 nike

在我的 Azure Service Fabric Web API 项目中,我可以在我的 Api.cs 类中使用以下代码将我的 appsettings.json 文件添加到我的配置中:

    protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
return new ServiceInstanceListener[]
{
new ServiceInstanceListener(serviceContext =>
new KestrelCommunicationListener(serviceContext, "ServiceEndpoint", (url, listener) =>
{
ServiceEventSource.Current.ServiceMessage(serviceContext, $"Starting Kestrel on {url}");

return new WebHostBuilder()
.UseKestrel()
.ConfigureAppConfiguration((builderContext, config) =>
{
var env = builderContext.HostingEnvironment;
config.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
})
.ConfigureServices((hostingContext, services) => services
.AddSingleton<StatelessServiceContext>(serviceContext)
.AddApplicationInsightsTelemetry(hostingContext.Configuration))
.UseContentRoot(Directory.GetCurrentDirectory())
.UseStartup<Startup>()
.UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.None)
.UseUrls(url)
.Build();
}))
};
}

env.ContentRootPath 包含这个值:

C:\SfDevCluster\Data\_App\_Node_0\Abc.IntegrationType_App197\Abc.Integration.ApiPkg.Code.1.0.0

在此文件夹中,我可以看到 appsettings.json 文件。

但是,在我的 Azure Service Fabric 无状态服务项目中,我的 Service.cs 类中有这段代码:

    protected override async Task RunAsync(CancellationToken cancellationToken)
{
Microsoft.AspNetCore.WebHost.CreateDefaultBuilder()
.ConfigureAppConfiguration((builderContext, config) =>
{
var env = builderContext.HostingEnvironment;

var appName = AppDomain.CurrentDomain.FriendlyName;
var parentFolderPath = Directory.GetParent(env.ContentRootPath).FullName;
var packageCodeFolderPath = Path.Combine(parentFolderPath, appName + "Pkg.Code.1.0.0");

config.SetBasePath(packageCodeFolderPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
})
.UseStartup<Startup>()
.Build()
.Run();
}

这里 env.ContentRootPath 包含这个值:

C:\SfDevCluster\Data\_App\_Node_0\Abc.Integration.OpticalType_App198\work

但是因为 appsettings.json 文件位于:C:\SfDevCluster\Data\_App\_Node_0\Abc.Integration.OpticalType_App198\Abc.Integration.Optical.ServicePkg.Code.1.0.0,

我被迫构建您在上面看到的 packageCodeFolderPath 变量。

这似乎不是一个非常优雅的解决方案,我担心 Pkg.Code.1.0.0 中的版本号可能会改变(如果那是版本号?)。

如何将 env.ContentRootPath 设置为包含 appsettings.json 文件的文件夹的路径?或者是否有更好的方法来访问这些文件?

最佳答案

在您的服务 list 中,您应该将 WorkingFolder 设置为 CodePackage,以便将 ContentRootPath 设置为代码 Abc.Integration.Optical.ServicePkg.Code。 1.0.0 而不是 work

即:

<EntryPoint>
<ExeHost>
<Program>myapp.exe</Program>
<WorkingFolder>CodePackage</WorkingFolder>
</ExeHost>
</EntryPoint>

查看文档 here

其他选项是从 SF 设置的环境变量中获取信息。在这里看看:https://learn.microsoft.com/en-us/azure/service-fabric/service-fabric-environment-variables-reference

或者,使用 Loek 在他的回答中建议的 context.CodePackageActivationContext.WorkDirectory

关于c# - IHostingEnvironment.ContentRootPath 如何设置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55822261/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com