Hizmet yapısı için her ortam için çalışma zamanı yapılandırma parametrelerini nereden ayarlar ve bunlara erişirsiniz?


82

Yerel ve bulut olmak üzere iki ortam için, Sql veritabanları, depolama hesapları vb. Gibi kaynaklar için özel ayarları veya parametreleri nasıl kurarım ... İdeal olarak, kodda bir DbContext'i belirli bir veritabanı, yerel veya bulut ortamı için yapılandırmalarda farklı olabilir. Teşekkür ederim.


Yapılandırmayı gerçekten kullanmak için uygulama kodunu dahil etseler de Microsoft, aşağıdaki makalede bunu ayarlamanızı gösteriyor: docs.microsoft.com/en-us/azure/service-fabric/…
Adam Plocher

Yanıtlar:


145

Service Fabric'i yerel olarak ve bulutta çalıştırmak için ortam başına değişkenlere sahip olmak için yapmanız gereken şudur:

  1. Özel yapılandırma bölümünüzü ve parametrelerinizi Service / Actor projesinin Settings.xml dosyasına ekleyin (proje kökünden \ PackageRoot \ Config \ Settings.xml konumunda bulunur). Bunları ortam başına başka bir yerde ayarlayacağımız için parametreleri boş bırakın. İşte bir örnek.
<?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. Service Fabric projenizin ApplicationManifest.xml dosyasında, <ServiceManifestImport>dahil ettiğiniz projelerin her biri için öğeler olacaktır . Bunun altında, <ConfigOverrides>yapılandırmalarımız için hangi değerlerin, Service Fabric projemizdeki ApplicationParameters altındaki ApplicationParameters altındaki yerel ve bulut xml dosyalarında ortam başına ayarlanan değerlerle değiştirileceğini açıklayacağımız bir öğe olacaktır. Aynı ApplicationManifest.xml dosyasında, yerel ve bulut xml dosyalarında bulunacak parametreyi eklemeniz gerekir, aksi takdirde derleme sırasında bunların üzerine yazılır.

Yukarıdaki örnekle devam edersek, bu nasıl ayarlanacağıdır.

<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. Service Fabric projenizde ApplicationParameters'ın altındaki local.xml ve cloud.xml dosyalarında, ortama özgü değişkenleri belirteceksiniz.
<?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. Son olarak, Service / Actor'da bu gibi ortam başına yapılandırma değişkenlerine erişebilirsiniz.
var configurationPackage = Context.CodePackageActivationContext.GetConfigurationPackageObject("Config");

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

101
Sadece "iğrenç!" Diyebilir miyim? Bu, basit bir çevre tabanlı ayar için umutsuzca kıvrımlıdır. Bu, SF ekibinin geliştirdiği bir çaba için olgunlaşmıştır.
BrettRobi

Neyi kaçırdığımdan emin değilim, ancak Bağlamımda bir CodePackageActivationContext yok. Vatansız hizmetlerimde yapıcıda OwinCommunicationListener'a aktarıldığını görüyorum. Ama Actor'da onu nereden alacağımdan emin değilim?
Steve

7
Erken soruldu. Buradaki yorumlar: azure.microsoft.com/en-us/documentation/articles/… Bunu kullanmayı işaret edin: CodePackageActivationContext activationContext = FabricRuntime.GetActivationContext ();
Steve

11
Bu gerçek dokümantasyondan çok daha iyi, teşekkürler! Ayrıca çok karışık olduğu konusunda hemfikir ... bu SF ekibini düzeltin!
naspinski

2
Bu ayarların geçersiz kılınmadığı bir sorunla karşılaşıyordum. Yukarıdaki parametreleri ServiceManifestImport(alt öğesi ApplicationManifest) tanımlamanız gerekir, ancak içine girmeniz gerekir ConfigOverrides(alt öğesi ServiceManifestImport).
Mardoxx

42

Ortam değişkenlerini tıpkı diğer uygulamalar gibi kullanabilirsiniz ; bu, yerleşik hizmet yapısı çalışma zamanını gerektirdiğinden farklı olarak hizmet yapısı içinde konuk yürütülebilir ile de çalışır settings.xml.

Uygulamanız içinde, diğer herhangi bir .net uygulaması gibi GetEnvironmentVariable, Environmentsınıftaki yöntem olsa da ortam değişkenlerine erişebilirsiniz :

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

Daha sonra bazı varsayılan ortam değişkenleri değerlerini ayarlamamız gerekir, bu ServiceManifest.xmlhizmetin manifest dosyasında yapılır .

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

Bu ortam değişkeni daha sonra ApplicationManifest.xmlaşağıdaki kod kullanılarak dosya içinde geçersiz kılınabilir :

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

Bu, daha sonra diğer uygulama bildirim ayarları gibi local.xmlve kullanılarak parametrelendirilebilir 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>

Daha sonra ApplicationManifest.xmlbu parametreleri desteklemek için güncellememiz gerekecek ;

<?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
Ortam değişkenini ayarlamanın daha düzgün bir yolu
hungryMind

2
Bu bağlantı bana da yardımcı oldu: binaryradix.com/2016/10/…
Darrel K.

7

Yukarıdaki cevaplar bunun nasıl yapıldığını çok iyi açıklıyor. Bir yan işaret eklemek istiyorum, neden bu kadar ' kıvrımlı ':

Hizmetlerin bağımsız olması amaçlandığından, bu şekilde olması gerekir. Bağlandıkları herhangi bir uygulamada varsayılan olarak çalıştırılmalıdırlar. Uygulamanın Manifestinden bağımsızdır. Bu nedenle, hizmet yalnızca kendi yapılandırmasında en azından önceden tanımlanmış parametrelere güvenebilir.

Bu ön ayarlar daha sonra uygulama tarafından üzerine yazılabilir. Bu tek evrensel yaklaşımdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.