Де ви встановлюєте та отримуєте доступ до параметрів конфігурації часу виконання для кожного середовища для тканини обслуговування?


82

Для двох середовищ, локальної та хмарної, як би я встановив власні параметри або параметри для ресурсів, таких як бази даних SQL, облікові записи зберігання тощо ... В ідеалі це було б одне ім'я параметра, яке викликається в коді, щоб сказати, вказувати DbContext до певного бази даних, які в конфігураціях для локального або хмарного середовища можуть бути різними. Дякую.


Хоча я хотів би, щоб вони включили код програми для фактичного використання конфігурації, Microsoft показує вам, щоб налаштувати його в такій статті: docs.microsoft.com/en-us/azure/service-fabric/…
Адам Плочер,

Відповіді:


145

Щоб мати змінні середовища для запуску Service Fabric локально та в хмарі, це те, що ви повинні зробити:

  1. Додайте свій спеціальний розділ конфігурації та параметри до файлу 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"];

101
Чи можу я просто сказати "тьфу!". Це безнадійно заплутано для простого середовища. Це дозріло для деяких зусиль розробника команди SF.
BrettRobi

Не знаю, чого я пропускаю, але мій контекст не має CodePackageActivationContext. У своїх службах без громадянства я бачу, що він передається конструктору OwinCommunicationListener. Але я не впевнений, де його взяти в «Акторі»?
Стів

7
Запитали передчасно. Коментарі тут: azure.microsoft.com/en-us/documentation/articles/... Вкажіть на використання цього: CodePackageActivationContext activationContext = FabricRuntime.GetActivationContext ();
Стів

11
Це набагато краще, ніж фактична документація, дякую! Також погодився, що це дуже заплутано ... виправте цю команду SF!
naspinski

2
Я отримував проблему, коли ці налаштування не були замінені. Ви повинні визначити параметри, наведені вище ServiceManifestImport(дочірній елемент ApplicationManifest), але ConfigOverridesповинні входити в нього (дочірній елемент ServiceManifestImport).
Mardoxx,

42

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

2
Більш акуратний спосіб встановити змінну середовища
hungryMind

2
Це посилання мені також допомогло: binaryradix.com/2016/10/…
Даррел К.

7

Наведені вище відповіді добре пояснюють, як це робиться. Я хочу додати sidemark, чому це , що « згорнутий »:

Це повинно бути таким чином, оскільки послуги призначені бути самостійними. Вони повинні працювати за замовчуванням у будь-якій програмі, до якої вони пов’язані. Незалежно від Маніфесту програми. Таким чином, служба може покладатися лише на параметри, які принаймні визначені у власній конфігурації.

Потім ці попередні налаштування можуть бути перезаписані програмою. Це єдиний універсальний підхід.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.