0

如果您创建一个新的 Service Fabric Web Api 应用程序,则该PackageRoot/ServiceManifest.xml文件具有一个ServiceManifest/Resource/Endpoints/Endpoint具有属性的节点Port。Service Fabric 使用它来决定托管服务的端口。

但是,如果您删除此属性,Service Fabric 将为您动态选择一个端口。

我正在尝试找到一种在应用程序运行时获取该端口的方法。

我知道我可以向 Service Fabric API 询问我的服务的端点列表,然后通过我当前的节点限制它。这非常接近。但是如果由于某种原因我的服务在同一个节点上托管了两次,那么我将无法知道哪个是“当前”应用程序。

我希望有一种方法不涉及对集群的服务调用。

选择的端口是否存储在我可以访问的地方。(在StatefulServiceContext也许?

4

2 回答 2

0

我想我找到了一种方法来获得这个价值。似乎服务结构为执行过程添加了一堆环境变量。其中一个有端口。

这段代码给了我我的端口号:

Environment.GetEnvironmentVariable("FABRIC_ENDPOINT_SERVICEENDPOINT")

需要注意的重要一点是,您用作环境变量查找字符串的值取决于您的应用程序的配置。

第一部分 (FABRIC_ENDPOINT_) 始终相同。

但其余的取决于我在问题(ServiceManifest.xml)中提到的配置文件中的值。它必须与ServiceManifest/Resource/Endpoints/EndpointName 属性中的内容相匹配。

于 2017-12-12T22:43:48.170 回答
0

您不能在 1 个应用程序的同一节点上运行同一服务(副本)的多个实例。因此,使用与此类GetApplicationListAsync似的代码,按当前应用程序名称过滤 API 查询。您可以从.ServiceContext

于 2017-12-12T14:08:42.450 回答