5

所以我有一个可用的.NET API 应用程序。他们的 API 库通过 .NET 远程调用与其主应用程序通信。为了使用 API,应用程序必须已经启动并运行。

所以,我有一个实例,我需要以编程方式启动应用程序,然后实例化其中一个 API 对象,它试图打开到主应用程序的 IPC 远程处理通道。问题是,在我启动进程后,启动和应用程序注册通道之间有几秒钟的时间。如果我尝试在注册通道之前实例化一个 API 对象,它就会消失。

我对 .NET 远程处理知之甚少,这于事无补。

我如何从我的应用程序中确定使用他们的 API 的应用程序是否已注册通信通道以便我知道可以实例化他们的 API 对象?

4

5 回答 5

2

尝试这个:

using System.Net.NetworkInformation;
using System.Net;
 private static bool IsPortAvailable(int port)
 {
        IPGlobalProperties globalProperties = IPGlobalProperties.GetIPGlobalProperties();
        IPEndPoint[] activeListeners = globalProperties.GetActiveTcpListeners();
        if (activeListeners.Any(conn => conn.Port == port))
        {
            return true;
        }
        return false;
 }

传入端口,您应该得到一个值,指示该端口上是否有侦听器。希望这会有所帮助

于 2009-09-25T01:40:07.893 回答
0

只是代码中的一个小错字。更正如下:

using System.Net.NetworkInformation; 
using System.Net; 
private static bool IsPortAvailable(int port) 
{ 
    IPGlobalProperties globalProperties = IPGlobalProperties.GetIPGlobalProperties(); 
    IPEndPoint[] activeListeners = globalProperties.GetActiveTcpListeners(); 
    if (activeListeners.Any(conn => conn.Port == port)) 
    { 
        return true; 
    } 
    return false; 
} 
于 2012-09-19T12:19:56.463 回答
0

Have you considered wrapping the attempt to instantiate API object into a try-catch block? Then you can analyze the exception and see if it was caused by the server not listening. And if it was, you can just wait and retry.

Makes sense?

于 2009-10-03T16:05:32.433 回答
0

开箱即用,您是否考虑过将 WCF 与 MSMQ 结合使用?我不确定我是否完全理解您的架构,但听起来 API 的客户端必须启动另一个托管 API 的进程。在您启动 API 主机和客户端尝试进行调用之间可能存在时间问题。Microsoft 最近已弃用 .NET Remoting(以及他们以前的所有其他通信技术,如 ASMX Web 服务)作为遗留技术,并强烈建议开发人员迁移到 WCF 平台。

如果您将 WCF 与 MSMQ 一起使用,那么您应该不会遇到计时问题。无论 API 主机是否正在运行,您的客户端应用程序都可以将消息放入持久队列中。API 主机可以随时启动,它将拾取并处理队列中等待的任何消息。即使您仍然让客户端应用程序启动 API 主机,时间问题也不再是问题,因为您使用队列而不是 .NET Remoting 来传输消息。WCF 为 MSMQ 提供了一个漂亮、方便、易于使用的包装器,因此入门门槛相对较低。

使用 WCF over .NET Remoting 的另一个好处是,您可以轻松地将 API 主机移动到不同的物理服务器,而无需更改客户端应用程序。如果您愿意,您甚至可以迁移到不同的队列平台(例如 AMQP 上的 RabbitMQ),而无需更改客户端或 API 主机应用程序。WCF 为您处理所有这些交互,在您的客户端应用程序和 API 主机之间提供更清晰的解耦和更可靠的通信。

如果迁移到 WCF 不是一个选项,您应该能够使用 .NET Remoting 显式设置端口。我不确定您是如何配置 API 主机的,但任何给定远程对象的 URL 通常采用以下形式:

tcp://<hostname>[:<port>]/<object>

如果添加端口,那么您应该能够使用 Abhijeet 的解决方案来确定端口是否打开。您不会获得 WCF 的松散耦合和可靠的通信优势,但肯定会减少工作量。;)

于 2009-10-03T07:18:18.380 回答
0

当您注册一个 IpcServerChannel 时,它会创建一个命名管道来与您为 IpcServerChannel 选择的端口名称的名称进行通信。您可以查看命名管道列表以查看您的端口名称是否存在。

System.IO.Directory.GetFiles(@"\\.\pipe\").Any((path) => path.Contains(@"\\.\pipe\" + pipeName));
于 2013-06-06T16:32:47.610 回答