Подтвердить что ты не робот

Где вы устанавливаете и получаете доступ к параметрам конфигурации во время выполнения для среды службы?

В двух средах, локальных и облачных, как мне настроить пользовательские настройки или параметры для таких ресурсов, как базы данных Sql, учетные записи хранилища и т.д. В идеале это будет одно имя параметра, называемое в коде, чтобы указать, укажите DbContext к конкретной базе данных, что в конфигурациях для локальной или облачной среды будет отличаться. Спасибо.

4b9b3361

Ответ 1

Чтобы иметь переменные среды для запуска Service Fabric локально и в облаке, это то, что вы должны сделать:

  • Добавьте свой настраиваемый раздел и параметры конфигурации в файл Settings.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>
  1. В файле 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>
  1. В файлах local.xml и cloud.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>
  1. Наконец, в вашем Сервис/Актер вы можете получить доступ к этим переменным конфигурации для каждой среды.
var configurationPackage = Context.CodePackageActivationContext.GetConfigurationPackageObject("Config");

var connectionStringParameter = configurationPackage.Settings.Sections["UserDatabase"].Parameters["UserDatabaseConnectionString"];

Ответ 2

Вы можете просто использовать переменные среды так же, как и любое другое приложение, это также работает с гостевым исполняемым в рабочей структуре в отличие от settings.xml поскольку для этого требуется встроенная среда выполнения рабочей среды.

В вашем приложении вы можете обращаться к переменным окружения, как и к любому другому.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>

Ответ 3

В приведенных выше ответах хорошо объясняется, как это делается. Я хочу добавить sidemark, почему это "запутанный":

Это должно быть таким образом, поскольку услуги должны быть автономными. Они должны запускаться по умолчанию в любом приложении, к которому они привязаны. Независимо от заявления Manifest. Таким образом, сервис может опираться только на параметры, которые, по крайней мере, предопределены в его собственной конфигурации.

Эти настройки могут быть перезаписаны приложением. Это единственный универсальный подход.