Gdzie można ustawić i uzyskać dostęp do parametrów konfiguracji czasu pracy dla środowiska service fabric?

W przypadku dwóch środowisk, lokalnego i chmurowego, jak skonfigurować niestandardowe ustawienia lub parametry dla zasobów, takich jak bazy danych Sql, konta pamięci masowej itp... Idealnie byłoby jeden parametr Nazwa wywołana w kodzie powiedzieć, skierować DbContext do konkretnej bazy danych, że w konfiguracjach dla środowiska lokalnego lub chmura być różne. Dziękuję.

Author: StampyTurtle, 2015-11-26

3 answers

Aby mieć zmienne środowiskowe dla uruchamiania Service Fabric lokalnie i w chmurze, musisz to zrobić:

  1. Dodaj własną sekcję konfiguracji i parametry do ustawień.plik xml projektu Service / Actor (znajduje się w \PackageRoot\config \ Settings.xml z katalogu głównego projektu). Pozostaw parametry puste, ponieważ będziemy ustawiać je w innym miejscu dla danego środowiska. Oto przykładowy.
<?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. W ApplicationManifest.plik xml twojego Projekt Service Fabric, będzie <ServiceManifestImport> elementy dla każdego z dołączonych projektów. Poniżej będzie <ConfigOverrides> element, w którym zadeklarujemy, jakie wartości dla naszych configów zostaną zastąpione przez wartości ustawione dla środowiska w lokalnych i chmurowych plikach xml pod ApplicationParameters w naszym projekcie Service Fabric. W tym samym Aplikacjimanifest.plik xml, musisz dodać parametr, który będzie obecny w lokalnych i chmurowych plikach xml, w przeciwnym razie zostaną one nadpisane buduj.

Kontynuując powyższy przykład, tak by to było ustawione.

<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. w lokalnym.xml i chmura.pliki xml pod ApplicationParameters w projekcie Service Fabric, można określić zmienne specyficzne dla środowiska, jak tak.
<?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. wreszcie, w usłudze / Actor możesz uzyskać dostęp do tych zmiennych konfiguracyjnych dla danego środowiska.
var configurationPackage = Context.CodePackageActivationContext.GetConfigurationPackageObject("Config");

var connectionStringParameter = configurationPackage.Settings.Sections["UserDatabase"].Parameters["UserDatabaseConnectionString"];
 117
Author: StampyTurtle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-02 18:00:51

Możesz po prostu używać zmiennych środowiskowych tak jak każda inna aplikacja, działa to również z programem wykonywalnym gościa W service fabric w przeciwieństwie do settings.xml, ponieważ wymaga to wbudowanego środowiska uruchomieniowego service fabric.

Wewnątrz Twojej aplikacji możesz uzyskać dostęp do zmiennych środowiskowych, tak jak każda inna aplikacja. NET za pomocą metody GetEnvironmentVariable w klasie Environment:

var baseUri = Environment.GetEnvironmentVariable("SuperWebServiceBaseUri");

Następnie musimy ustawić domyślne wartości zmiennych środowiskowych, odbywa się to w ServiceManifest.xml plik manifestu usługi.

<?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>

Zmienna środowiskowa może zostać nadpisana w pliku ApplicationManifest.xml za pomocą następującego kodu:

<?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>

To może być parametryzowane jak każde inne ustawienie manifestu aplikacji za pomocą local.xml i 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>

Następnie będziemy musieli zaktualizować ApplicationManifest.xml, aby obsługiwać te parametry;

<?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>
 29
Author: Kevin Smith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-22 22:52:15

Powyższe odpowiedzi dobrze wyjaśniają, jak to się robi. Chcę dodać sidemark, dlaczego jest tak, że ' convoluted':

Tak musi być, ponieważ usługi mają być samodzielne. Powinny one działać domyślnie w każdej aplikacji, do której są połączone. Niezależnie od manifestu aplikacji. Tak więc usługa może polegać tylko na parametrach, które są przynajmniej predefiniowane we własnej konfiguracji.

Te ustawienia wstępne mogą być następnie nadpisane przez aplikację. To jest jedyne uniwersalne podejście.

 5
Author: BaluJr.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-01 10:35:42