我最近将一个 Azure 应用程序部署到临时环境,该应用程序应该在端口 2993 中接受 TCP 数据包。当在 Azure 模拟器中运行时,它做得很好,并且完全按照应有的方式执行。
但是,现在它位于 Azure 的临时服务器上,每当我尝试连接到 TCP 端口时,都会收到以下 SocketException:
A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.
我的 Web 应用程序有两个实例,一个是辅助角色(在其端点中配置了 2993),另一个是 Web 角色(仅适用于端口 80)。顺便说一句,端口 80 运行良好。该 Web 应用程序是使用 Visual Studio 使用 C# 创建的。为什么会发生这种情况以及如何解决它?
非常感谢所有帮助。
最佳答案
我想解释一下问题是什么以及为什么添加上面的代码可以解决这个问题以使其他人受益。
在您的辅助角色中,您可以配置任何 TCP 端点以及任何端口号。当此 VM 启动时,VM 将被配置为使用此端口,并且防火墙作为异常(exception)提供对此端口的访问。当您准备好启动时,您的 Azure VM 已经拥有 TCP/IP 地址并且配置的端口已启用。
现在,当您的角色开始时,如果您有任何服务或应用程序需要访问此端口,您确实需要 l
例如,如果我在辅助角色中配置了 Tomcat/Java,则必须在配置的端口上创建 TCP 监听器。当我的辅助角色启动时可以完成此操作,如下所示:
- 获取当前角色实例的IP地址和端口号
- 创建 TCP 监听器并在此 IP 地址和端口上启动
- 在我的辅助角色 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 或辅助角色来说,这是必须设置。
关于c# - TCP 连接到 Azure 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10645656/