1

我最近在暂存环境中部署了一个 Azure 应用程序,该应用程序应该在端口 2993 中接受 TCP 数据包。在 Azure 模拟器中运行时,它可以很好地执行此操作,并且完全按照应有的方式执行。

但是,现在它在 Azure 的登台服务器上,每当我尝试连接到 TCP 端口时,我都会收到以下 SocketException:

连接尝试失败,因为连接方在一段时间后没有正确响应,或者连接失败,因为连接的主机没有响应。

我的 Web 应用程序有两个实例,一个是工作角色(在其端点中配置了 2993)和一个 Web 角色(仅用于端口 80)。顺便说一句,端口 80 运行良好。Web 应用程序是使用 C# 中的 Visual Studio 创建的。为什么会发生这种情况,我该如何解决?

非常感谢所有帮助。

4

2 回答 2

0

看来问题与程序对服务器 IP 地址的检测有关。通过使用以下服务器代码,我设法解决了这个问题:

RoleInstanceEndpoint externalEndPoint = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["TCPin"];
        IPEndPoint localEndPoint = new IPEndPoint(externalEndPoint.IPEndpoint.Address, externalEndPoint.IPEndpoint.Port);

然后可以将 IPEndpoint 与 tcpListener 套接字一起使用。

于 2012-05-18T03:15:47.730 回答
0

我想解释一下问题是什么,以及为什么添加上面的代码可以解决这个问题,让其他人受益。

在您的工作角色中,您可以配置任何 TCP 端点以及任何端口号。当此 VM 启动时,VM 被配置为使用此端口,并且防火墙包含一个例外以提供对此端口的访问。当您准备好启动 Azure VM 时,您已经拥有 TCP/IP 地址并启用了配置的端口。

现在,当您的角色开始时,如果您有任何服务或应用程序需要访问此端口,您真的需要

例如,如果我在我的工作角色中配置了 Tomcat/Java,我必须在我配置的端口上创建一个 TCP 侦听器。这可以在我的工人角色开始时完成,如下所示:

  1. 获取当前角色实例的IP地址和端口号
  2. 创建一个 TCP 侦听器并在此 IP 地址和端口上启动
  3. 在我的辅助角色 OnStart() 函数中添加代码以执行步骤 1) 和 2)。

代码如下所示:

TcpListener TomcatPortListener = new  TcpListener(RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["TomcatWeb80"].IPEndpoint);
TomcatPortListener.Start();

在您的情况下,您所做的完全相同,您从中获得了 IP 地址和端口号,然后使用 IP/端口从套接字地址创建了一个端点:

RoleInstanceEndpoint externalEndPoint = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["TCPin"];
IPEndPoint localEndPoint = new IPEndPoint(externalEndPoint.IPEndpoint.Address, externalEndPoint.IPEndpoint.Port);
localEndPoint.Create();

对于创建 TCP 端点的任何 Web 或工作角色来说,这是必须设置的。

于 2012-05-18T05:43:27.130 回答