Sta*_*tle 77 azure azure-service-fabric azure-sql-database
对于本地和云两种环境,我如何为资源(如Sql数据库,存储帐户等)设置自定义设置或参数...理想情况下,它将是代码中调用的一个参数名称,将DbContext指向特定的数据库,在本地或云环境的配置中是不同的.谢谢.
Sta*_*tle 139
为了在本地和云中运行Service Fabric的每个环境变量,您必须这样做:
<?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>
Run Code Online (Sandbox Code Playgroud)
<ServiceManifestImport>,每个包含的项目都有元素.在下面,<ConfigOverrides>我们将声明我们的配置的哪些值将被我们的Service Fabric项目中ApplicationParameters下面的本地和云xml文件中的每个环境设置的值所取代.在同一个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>
Run Code Online (Sandbox Code Playgroud)
<?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>
Run Code Online (Sandbox Code Playgroud)
var configurationPackage = Context.CodePackageActivationContext.GetConfigurationPackageObject("Config");
var connectionStringParameter = configurationPackage.Settings.Sections["UserDatabase"].Parameters["UserDatabaseConnectionString"];
Run Code Online (Sandbox Code Playgroud)
Kev*_*ith 38
您可以像使用任何其他应用程序一样使用环境变量,这也适用于服务结构中的客户机可执行文件,这与settings.xml需要内置服务结构运行时不同.
在您的应用程序中,您可以通过类中的GetEnvironmentVariable方法访问环境变量,就像任何其他.net应用程序一样Environment:
var baseUri = Environment.GetEnvironmentVariable("SuperWebServiceBaseUri");
Run Code Online (Sandbox Code Playgroud)
然后我们需要设置一些默认的环境变量值,这是在服务的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>
Run Code Online (Sandbox Code Playgroud)
然后,可以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>
Run Code Online (Sandbox Code Playgroud)
然后可以像使用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>
Run Code Online (Sandbox Code Playgroud)
然后我们将不得不更新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>
Run Code Online (Sandbox Code Playgroud)
上面的答案很好地解释了它是如何完成的。我要添加一个标记,为什么它是“ 令人费解的 ”:
由于服务旨在独立存在,因此必须采用这种方式。默认情况下,它们应在链接到的任何应用程序中运行。独立于应用程序的清单。因此,该服务只能依赖至少在其自己的配置中预定义的参数。
这些预设然后可以被应用程序覆盖。这是唯一的通用方法。
| 归档时间: |
|
| 查看次数: |
25830 次 |
| 最近记录: |