Service Fabric 0x80004005拒绝访问打开HttpListener的端口

时间:2016-09-20 11:02:03

标签: azure-service-fabric

我在本地(开发)服务结构实例中遇到以下错误消息:

2016-09-20 12:56:16.5008 WARN   7  Metrics.Visualization.MetricsHttpListener Unable to start HTTP Listener. Sleeping for 1 sec and retrying 2 more times System.Net.HttpListenerException (0x80004005): Access is denied
   at System.Net.HttpListener.AddAllPrefixes()
   at System.Net.HttpListener.Start()
   at Metrics.Visualization.MetricsHttpListener.Start() in C:\Work\Metrics.NET\Src\Metrics\Visualization\MetricsHttpListener.cs:line 97
   at Metrics.Visualization.MetricsHttpListener.<>c__DisplayClass15_0.<<StartHttpListenerAsync>b__0>d.MoveNext() in C:\Work\Metrics.NET\Src\Metrics\Visualization\MetricsHttpListener.cs:line 62

Metrics.Net正在尝试打开一个端口。显然失败了。我想知道如何解决这个问题。

在我的ServiceManifest.xml中,我添加了以下行:

 <Resources>
    <Endpoints>
      <!-- This endpoint is used by the communication listener to obtain the port on which to 
           listen. Please note that if your service is partitioned, this port is shared with 
           replicas of different partitions that are placed in your code. -->
      <Endpoint Name="MyApplicationTypeEndpoint" Protocol="http" Port="20002" />
    </Endpoints>
  </Resources>

端口是正确的。

还有什么我应该照顾的吗?
(另请注意 - 如何打开端口范围而不是单个端口?)

1 个答案:

答案 0 :(得分:2)

您确定要添加到HttpListener Url Prefix的网址是否正在使用ServiceManifest.xml中定义的端口?

“拒绝访问”或者意味着:

  1. 其他人已经在使用该端口
  2. 您没有使用在ServiceManifest.xml中设置的端口
  3. 您已经可以使用应用程序端口范围内的任何端口。该范围是Service Fabric通过操作系统防火墙打开的高端口号范围内的一组端口。当您在端口0上打开套接字时,这些端口来自TCP / IP堆栈为您提供的相同应用程序端口池。或者,如果您在ServiceManifest.xml中设置端点配置并且不要在那里指定一个端口号,你将从这个范围获得一个随机端口。

    您在ServiceManifest.xml中定义的端口主要用于http.sys URL ACLing。如果它是应用程序端口范围之外的端口,它还将通过操作系统防火墙打开一个端口。

    通过负载均衡器“打开”到Internet的端口是一个不同的故事,与Service Fabric并不真正相关。这更像是硬件/拓扑配置(Service Fabric是所有软件)。在Azure中,您可以通过群集的Resource Manager JSON进行配置,甚至可以在创建群集时通过Azure门户进行配置。

    应用程序端口范围是在群集中的每个节点(或Azure中的每个VMSS)中定义的。