Azure service fabric 在运行时将服务实例ID传递到来宾可执行文件

Azure service fabric 在运行时将服务实例ID传递到来宾可执行文件,azure-service-fabric,Azure Service Fabric,是否可以在运行时将服务实例ID(int值)传递到来宾可执行文件中?我已经看过了,但它只适用于必须预先提供的静态数据。它在环境变量中可用。有关服务可用的环境变量的完整列表,请参见此处: 请注意,您请求的服务包instanceId通常仅用于内部消费,它标识整个服务包。这意味着,如果您的服务包中有多个代码包(可执行文件),它们将获得相同的ID。它在环境变量中可用。有关服务可用的环境变量的完整列表,请参见此处: 请注意,您请求的服务包instanceId通常仅用于内部消费,它标识整个服务包。这意味着,如

是否可以在运行时将服务实例ID(int值)传递到来宾可执行文件中?我已经看过了
,但它只适用于必须预先提供的静态数据。

它在环境变量中可用。有关服务可用的环境变量的完整列表,请参见此处:


请注意,您请求的服务包instanceId通常仅用于内部消费,它标识整个服务包。这意味着,如果您的服务包中有多个代码包(可执行文件),它们将获得相同的ID。

它在环境变量中可用。有关服务可用的环境变量的完整列表,请参见此处:


请注意,您请求的服务包instanceId通常仅用于内部消费,它标识整个服务包。这意味着,如果服务包中有多个代码包(可执行文件),它们都将获得相同的ID。

环境变量提供的服务包实例ID与实例/副本ID不同。一般来说,SF的环境变量可以使用
FabriRuntime
提供相同的可用信息,即节点上下文和代码包激活上下文。在本机SF服务中,实例ID在运行时由结构(在
ServiceContext
类中)提供,因为单个进程可以承载多个分区和实例/副本

在不使用SF API的来宾可执行文件中,AFAIK的唯一选项是在单独的可执行文件中查询结构中的此信息,将其作为
SetupEntryPoint
(每次在来宾可执行文件之前运行)运行,并将信息写入文件

例如(将代码编译成
GetFabricData.exe
并将其添加到代码包中):

private static async Task mainaync(字符串[]args)
{
var serviceTypeName=args.FirstOrDefault();
if(string.IsNullOrEmpty(serviceTypeName))抛出新的ArgumentNullException(nameof(serviceTypeName));
使用(var client=new FabricClient())
{
var activationContext=FabricRuntime.GetActivationContext();
var nodeContext=FabricRuntime.GetNodeContext();
var nodeName=nodeContext.nodeName;
var applicationName=新Uri(activationContext.applicationName);
var replicas=await client.QueryManager.GetDeployedReplicaListAsync(nodeName,applicationName);
//通常采取第一种可能是不正确的
//但在来宾可执行文件中,不太可能有多个分区/实例
var instance=replications.OfType()
.FirstOrDefault(c=>c.ServiceTypeName==ServiceTypeName);
if(实例==null)
{
抛出新的InvalidOperationException($“找不到{serviceTypeName}的服务实例”);
}
File.writealText(“FabricData”,instance.InstanceId.ToString());
}
}
在服务清单中:


GetFabricData.exe
客人类型

然后,来宾可执行文件可以简单地读取
FabricData
文件。

环境变量提供的服务包实例ID与实例/副本ID不同。一般来说,SF的环境变量可以使用
FabricRuntime
提供相同的可用信息,即节点上下文和代码包激活上下文。在本机SF服务中,实例ID在运行时由结构(在
ServiceContext
类中)提供,因为单个进程可以承载多个分区和实例/副本

在不使用SF API的来宾可执行文件中,AFAIK的唯一选项是在单独的可执行文件中查询结构中的此信息,将其作为
SetupEntryPoint
(每次在来宾可执行文件之前运行)运行,并将信息写入文件

例如(将代码编译成
GetFabricData.exe
并将其添加到代码包中):

private static async Task mainaync(字符串[]args)
{
var serviceTypeName=args.FirstOrDefault();
if(string.IsNullOrEmpty(serviceTypeName))抛出新的ArgumentNullException(nameof(serviceTypeName));
使用(var client=new FabricClient())
{
var activationContext=FabricRuntime.GetActivationContext();
var nodeContext=FabricRuntime.GetNodeContext();
var nodeName=nodeContext.nodeName;
var applicationName=新Uri(activationContext.applicationName);
var replicas=await client.QueryManager.GetDeployedReplicaListAsync(nodeName,applicationName);
//通常采取第一种可能是不正确的
//但在来宾可执行文件中,不太可能有多个分区/实例
var instance=replications.OfType()
.FirstOrDefault(c=>c.ServiceTypeName==ServiceTypeName);
if(实例==null)
{
抛出新的InvalidOperationException($“找不到{serviceTypeName}的服务实例”);
}
File.writealText(“FabricData”,instance.InstanceId.ToString());
}
}
在服务清单中:


GetFabricData.exe
客人类型

然后,来宾可执行文件可以简单地读取
FabricData
文件。

您打算用它做什么?它是可用的(见我的答案),但它是否真的有用取决于你打算用它做什么。你打算用它做什么?它是可用的(请参阅我的答案),但它是否真正有用取决于您计划如何使用它。在我的情况下,来宾可执行文件不支持SF,因此查询不是一个选项。瓦茨拉夫所说的效果最好。@SeanFeldman我明白,我不是建议你在可执行文件中添加SF代码,而是