Azure 服务总线中继定期断开连接
Azure Service Bus Relay Periodical Disconnection
我正在使用 Azure 服务总线中继实现服务主机。实施非常简单:
Program.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 的连接。再次建立连接后,断开循环继续。
然而,这种情况只发生在我的本地机器上。该服务在其他环境设置的机器上运行良好。
这可能是我实现的服务主机还是与本地网络有关?
Could this be my implementation of the service host or is it something to do with the local network?
如果您看到正在发送 FIN,则表示实体(客户端和服务器)有意关闭连接。因此在应用程序的实施中而不是通过网络。过渡到关闭等待意味着 FIN 已收到并得到确认,收到 FIN 的一方需要调用 close
.
以上问题已解决。似乎中继服务使用 TCP 端口 5671 与 Azure 通信。我们的网络防火墙没有打开该端口,因此强制关闭已建立的连接。因此,应打开 TCP 端口 5671 以与 Azure 进行通信。
我正在使用 Azure 服务总线中继实现服务主机。实施非常简单:
Program.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 的连接。再次建立连接后,断开循环继续。
然而,这种情况只发生在我的本地机器上。该服务在其他环境设置的机器上运行良好。
这可能是我实现的服务主机还是与本地网络有关?
Could this be my implementation of the service host or is it something to do with the local network?
如果您看到正在发送 FIN,则表示实体(客户端和服务器)有意关闭连接。因此在应用程序的实施中而不是通过网络。过渡到关闭等待意味着 FIN 已收到并得到确认,收到 FIN 的一方需要调用 close
.
以上问题已解决。似乎中继服务使用 TCP 端口 5671 与 Azure 通信。我们的网络防火墙没有打开该端口,因此强制关闭已建立的连接。因此,应打开 TCP 端口 5671 以与 Azure 进行通信。