在Service Fabric中,我可以使用应用程序参数更改ServiceManifest.xml文件中的Arguments吗?

时间:2016-05-27 16:43:57

标签: azure azure-service-fabric

我有一个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" xmlns="http://schemas.microsoft.com/2011/01/fabric"
   ApplicationTypeName="ServiceFabricTestType" ApplicationTypeVersion="1.9">
   <Parameters>
     <Parameter Name="Prop_BehavioursPath" DefaultValue="behaviours.yml"/>
     <Parameter Name="Prop_AliasesPath" DefaultValue="aliases.yml"/>
   </Parameters>
  <ServiceManifestImport>
  <ServiceManifestRef 
    ServiceManifestName="SummaryGenerator" 
    ServiceManifestVersion="1.9.0.0" 
    />
  </ServiceManifestImport>
</ApplicationManifest>

我想使用这些参数调整我的guest虚拟机托管服务的Argument,在ServiceManifest.xml文件中声明如下:

<?xml version="1.0" encoding="utf-8"?>
<ServiceManifest 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"
   Name="SummaryGenerator" Version="1.9.0.0">
   <ServiceTypes>
     <StatelessServiceType ServiceTypeName="SummaryGenerator" UseImplicitHost="true"/>
   </ServiceTypes>
   <CodePackage Name="code" Version="1.9.0.0">
   <EntryPoint>
     <ExeHost>
        <Program>MyProgram.exe</Program>
        <Arguments>&quot;LoadFrom=[Prop_AliasesPath]|[Prop_BehavioursPath]&quot;</Arguments>
        <ConsoleRedirection FileRetentionCount="5" FileMaxSizeInKb="2048"/>
     </ExeHost>
   </EntryPoint>
  </CodePackage>
</ServiceManifest>

这显然不起作用,因为进入参数的属性被逐字处理,而不是从参数值中解析。

我真正想要做的是能够启动服务并为Prop_BehavioursPath和Prop_AliasesPath传递不同的值。在Service Fabric中有更好的方法吗?

正在运行的应用程序不了解Service Fabric,将配置推送到它的唯一方法是通过命令参数。

2 个答案:

答案 0 :(得分:2)

看起来你不能这样做......相反,你可以尝试一种解决方法,你可以编写一个小的.NET包装器来读取sf配置,然后启动你的guest虚拟机可执行文件。您可以从子进程重定向stdin / stdout并挂钩到它的退出事件,因此主进程在子进程终止时终止。

答案 1 :(得分:0)

类似于参数,您可以在ServiceManifest.xml中定义环境变量(例如Prop_AliasesPath和Prop_BehavioursPath),然后在ApplicationManifest.xml中覆盖它们的值。然后,您有两个选择:

选项1: 即使您的入口点MyProgram.exe不支持服务结构,它也可以读取环境变量。

选项2: 为了避免读取MyProgram.exe内部的环境变量,可以将批处理文件用作入口点,并从该文件中调用“ MyProgram.exe LoadFrom =%Prop_AliasesPath %% Prop_BehavioursPath%”

有关覆盖环境变量的更多信息: https://dzimchuk.net/using-code-package-environment-variables-in-service-fabric/