在我的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
文件的文件夹的路径?还是有更好的方法来访问这些文件?
答案 0 :(得分:2)
在服务清单中,应将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://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-environment-variables-reference
或者,使用Loek在回答中建议的context.CodePackageActivationContext.WorkDirectory
。
答案 1 :(得分:1)
我建议使用serviceContext
属性CodePackageActivationContext
来找到SF work folder,并将其用作参考。 (Environment.CurrentDirectory
的值在1个节点与5个节点的群集上有所不同,因此不可靠。)
因此使用:
context.CodePackageActivationContext.WorkDirectory
CodePackageActivationContext
还包含代码包version字符串(确实是版本定义)。