【问题标题】:Azure Service Bus Relay Periodical DisconnectionAzure 服务总线中继定期断开连接
【发布时间】:2015-04-27 06:52:03
【问题描述】:

我正在使用 Azure 服务总线中继实现服务主机。实现非常简单:

程序.cs:

public class Program
{
    public static void Main(string[] args)
    {
        var random = new Random(Environment.TickCount);

        ServiceHost sh = new ServiceHost(typeof(ProblemSolver));

        var endpoint = sh.Description.Endpoints[0];
        var serviceRegistrySettings = new ServiceRegistrySettings(DiscoveryType.Public);
        endpoint.Behaviors.Add(serviceRegistrySettings);
        string randomText = random.Next().ToString();
        var listenUri = new Uri(endpoint.Address.Uri, randomText  + "/");
        endpoint.ListenUri = listenUri;

        sh.Open();
        Console.WriteLine("Hosted: " + randomText);
        Console.ReadLine();
        sh.Close();
    }
}

app.config:

<bindings>
  <netTcpRelayBinding>
    <binding name="default">
      <security mode="None" relayClientAuthenticationType="RelayAccessToken" />
    </binding>
  </netTcpRelayBinding>
</bindings>
<services>
  <service name="RelayPrototype.ProblemSolver">
    <endpoint contract="RelayServiceContract.IProblemSolver"
              binding="netTcpRelayBinding"
              bindingConfiguration="default"
              address="sb://test.servicebus.windows.net/problemSolver/"
              listenUri ="sb://test.servicebus.windows.net/problemSolver/"
              behaviorConfiguration="sbTokenProvider"/>
  </service>
</services>
<behaviors>
  <endpointBehaviors>
    <behavior name="sbTokenProvider">
      <transportClientEndpointBehavior>
        <tokenProvider>
          <sharedAccessSignature keyName="RootManageSharedAccessKey" key="[mykey]" />
        </tokenProvider>
      </transportClientEndpointBehavior>
    </behavior>
  </endpointBehaviors>
</behaviors>

我面临的问题是,一旦托管,它会在 2 分钟间隔后定期断开连接。

此时,服务主机的 TCP 状态由 ESTABLISHED 变为 CLOSE_WAIT。

监控 TCP 流量,我发现源 ns-sb2-prod-sg3-001.cloudapp.net 发送了一个包含 FIN 标志的数据包,我怀疑这可能导致断开连接。

服务主机将在一段时间后再次尝试建立与 Azure 的连接。一旦再次建立连接,断开循环将继续。

但是,这种情况只发生在我的本地机器上。该服务可以在其他环境设置的机器上正常托管。

这可能是我对服务主机的实现还是与本地网络有关?

【问题讨论】:

    标签: c# wcf azure tcp


    【解决方案1】:

    这可能是我实现的服务主机还是与本地网络有关?

    如果您看到正在发送的 FIN 意味着实体(客户端和服务器)故意关闭连接。因此在应用程序的实现中而不是在网络中。转换为关闭等待意味着 FIN 已被接收并确认,接收到 FIN 的一方需要调用close

    【讨论】:

    • 这有助于把事情弄清楚一点。您知道 Azure 为何尝试关闭连接吗?建立后2分钟的固定间隔。
    • @cruelays 不。不熟悉 Azure。可能是持久性 TCP 连接的一些设置?为什么托管在外部机器上会很好,而不是你的本地机器?跟踪事件是托管服务触发close-event
    【解决方案2】:

    上面的问题解决了。中继服务似乎使用 TCP 端口 5671 与 Azure 进行通信。我们的网络防火墙没有打开该端口,因此强制关闭已建立的连接。因此,应该打开 TCP 端口 5671 以便与 Azure 进行通信。

    【讨论】:

      猜你喜欢
      • 2014-09-02
      • 1970-01-01
      • 2023-01-19
      • 2014-03-29
      • 1970-01-01
      • 2013-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多