Где можно задать параметры конфигурации среды выполнения для Service fabric и получить к ним доступ?
для двух сред, локальной и облачной, как настроить пользовательские настройки или параметры для таких ресурсов, как базы данных Sql, учетные записи хранения и т. д... В идеале это было бы одно имя параметра, вызываемое в коде, чтобы сказать, указать DbContext на определенную базу данных, что в конфигурациях для локальной или облачной среды будет отличаться. Спасибо.
3 ответа:
чтобы иметь переменные среды для запуска Service Fabric локально и в облаке, это то, что вы должны сделать:
- добавьте свой пользовательский раздел конфигурации и параметры в Настройки.xml-файл проекта Service / Actor (находится по адресу \PackageRoot\Config\Settings.xml из корня проекта). Оставьте параметры пустыми, поскольку мы будем устанавливать их в другом месте для каждой среды. Вот один из примеров.
<?xml version="1.0" encoding="utf-8" ?> <Settings xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/2011/01/fabric"> <!-- Add your custom configuration sections and parameters here --> <Section Name="UserDatabase"> <Parameter Name="UserDatabaseConnectionString" Value="" /> </Section> </Settings>
- в ApplicationManifest.xml-файл вашего проекта Service Fabric, там будет
<ServiceManifestImport>
элементы для каждого из ваших включены проектов. Под этим будет<ConfigOverrides>
элемент, где мы объявим, какие значения для наших конфигураций будут заменены значениями, установленными для каждой среды в локальных и облачных xml-файлах под ApplicationParameters в нашем проекте Service Fabric. В том же ApplicationManifest.xml-файл, вам нужно будет добавить параметр, который будет присутствовать в локальных и облачных xml-файлах, в противном случае они будут перезаписаны при сборке.продолжая пример выше, вот как это будет установлено.
<Parameters> <Parameter Name="ServiceName_InstanceCount" DefaultValue="-1" /> <Parameter Name="UserDatabaseConnectionString" DefaultValue="" /> </Parameters> <ConfigOverrides> <ConfigOverride Name="Config"> <Settings> <Section Name="UserDatabase"> <Parameter Name="UserDatabaseConnectionString" Value="[UserDatabaseConnectionString]" /> </Section> </Settings> </ConfigOverride> </ConfigOverrides>
- в местный.xml и облако.xml-файлы под ApplicationParameters в вашем проекте Service Fabric вы будете указывать свои переменные среды, например.
<?xml version="1.0" encoding="utf-8"?> <Application xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="fabric:/AppFabricName.ServiceFabric" xmlns="http://schemas.microsoft.com/2011/01/fabric"> <Parameters> <Parameter Name="ServiceName_InstanceCount" Value="1" /> <Parameter Name="UserDatabaseConnectionString" Value="Server=(localdb)\MsSqlLocalDb;Database=Users;User=ReadOnlyUser;Password=XXXXX;" /> </Parameters> </Application>
- наконец, в вашем сервисе / Акторе вы можете получить доступ к этим переменным конфигурации для каждой среды, таким как так.
var configurationPackage = Context.CodePackageActivationContext.GetConfigurationPackageObject("Config"); var connectionStringParameter = configurationPackage.Settings.Sections["UserDatabase"].Parameters["UserDatabaseConnectionString"];
вы можете просто использовать переменные среды как и любое другое приложение, это также работает с гостевой исполняемый файл внутри Service fabric в отличие от
settings.xml
поскольку для этого требуется встроенная среда выполнения Service fabric.в вашем приложении вы можете получить доступ к переменным среды так же, как и любое другое приложение .net, хотя
GetEnvironmentVariable
методEnvironment
класс:var baseUri = Environment.GetEnvironmentVariable("SuperWebServiceBaseUri");
Затем нам нужно настроить некоторую среду по умолчанию переменные значения, это делается в пределах
ServiceManifest.xml
файл манифеста сервиса.<?xml version="1.0" encoding="utf-8" ?> <ServiceManifest Name="MyServicePkg" Version="1.0.0" xmlns="http://schemas.microsoft.com/2011/01/fabric" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <!-- snip --> <CodePackage Name="Code" Version="1.0.0"> <!-- snip --> <EnvironmentVariables> <EnvironmentVariable Name="SuperWebServiceBaseUri" Value="http://localhost:12345"/> </EnvironmentVariables> </CodePackage> <!-- snip --> </ServiceManifest>
эти переменные среды могут быть переопределены в пределах
ApplicationManifest.xml
файл с помощью следующего кода:<?xml version="1.0" encoding="utf-8"?> <ApplicationManifest xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ApplicationTypeName="ChileTargetType" ApplicationTypeVersion="1.0.0" xmlns="http://schemas.microsoft.com/2011/01/fabric"> <Parameters> <!-- snip --> </Parameters> <ServiceManifestImport> <ServiceManifestRef ServiceManifestName="MyServicePkg" ServiceManifestVersion="1.0.0" /> <EnvironmentOverrides CodePackageRef="Code"> <EnvironmentVariable Name="SuperWebServiceBaseUri" Value="https://the-real-live-super-base-uri.com/"/> </EnvironmentOverrides> </ServiceManifestImport> <!-- snip --> </ApplicationManifest>
затем это можно параметризовать, как и любой другой параметр манифеста приложения, используя
local.xml
иcloud.xml
.<?xml version="1.0" encoding="utf-8"?> <Application xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="fabric:/AppFabricName.ServiceFabric" xmlns="http://schemas.microsoft.com/2011/01/fabric"> <Parameters> <Parameter Name="MyService_SuperWebServiceBaseUri" Value="https://another-base-uri.com/" /> </Parameters> </Application>
тогда нам придется обновить
ApplicationManifest.xml
для поддержки этих параметров;<?xml version="1.0" encoding="utf-8"?> <ApplicationManifest xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ApplicationTypeName="ChileTargetType" ApplicationTypeVersion="1.0.0" xmlns="http://schemas.microsoft.com/2011/01/fabric"> <Parameters> <Parameter Name="MyService_SuperWebServiceBaseUri" DefaultValue="https://the-real-live-super-base-uri.com/" /> </Parameters> <ServiceManifestImport> <ServiceManifestRef ServiceManifestName="MyServicePkg" ServiceManifestVersion="1.0.0" /> <EnvironmentOverrides CodePackageRef="Code"> <EnvironmentVariable Name="SuperWebServiceBaseUri" Value="[MyService_SuperWebServiceBaseUri]"/> </EnvironmentOverrides> </ServiceManifestImport> <!-- snip --> </ApplicationManifest>
приведенные выше ответы хорошо объясняют, как это делается. Я хочу добавить боковой знак, почему это так'извитых':
Это должно быть так, как услуги предназначены для автономного использования. Они должны выполняться по умолчанию в любом приложении, с которым они связаны. Независимо от манифеста приложения. Таким образом, сервис может полагаться только на параметры, которые, по крайней мере, предопределены в его собственной конфигурации.
эти предустановки затем могут быть перезаписаны приложение. Это единственный универсальный подход.