自定义API要求

时间:2010-06-07 18:33:25

标签: c# .net api com

我们目前正在为现有系统开发API。

它基本上将一些Web请求包装为易于使用的库,第三方公司应该能够将其与我们的产品一起使用。

作为API的一部分,有一种事件机制,服务器可以通过持续运行的套接字连接回调客户端。

为了最大限度地减少服务器上的负载,我们希望每台计算机只有一个连接。目前,每个进程都有一个套接字打开,如果你有多个使用API​​的应用程序,最终可能会导致加载问题。

所以我的问题是:如果我们想将API部署为单个独立程序集,那么解决问题的最佳方法是什么?

我们想到了几个选项:

  • 编写一个进程外COM对象(不知道是否在.Net中运行)
  • 包含事件所需的第二个exe文件,它必须自己单实例,并打开命名管道或通过多个进程进行通信的东西
  • 从嵌入式资源中提取此exe文件并执行它

这些都不是真正理想的。

有更好的想法吗?

5 个答案:

答案 0 :(得分:0)

你的意思是Net.TCP port sharing吗?

答案 1 :(得分:0)

您可以在打开套接字时修复客户端端口,例如45534.由于一个端口只能由一个进程打开,因此一次只能有一个进程打开到服务器的套接字连接。

答案 2 :(得分:0)

嗯,有很多方法可以解决这个问题,如所有答案和评论中所表达的那样,但可能更简单的方法就是将全局状态存储在一个可供当前机器的所有用户访问的地方(可能是否可能有各种用户登录机器)存储的地方世界卫生组织有权将其打开。曾经被称为“锁定”的东西。该存储可以是本地或Intranet数据库中的字段,简单文件或其他任何内容。这样您就不需要构建或分发额外的二进制文件。

答案 3 :(得分:0)

当客户端连接到您的服务器时,您创建一个新线程来处理他(而不是进程)。您可以将其IP地址存储在静态字典中(在所有线程之间共享)。 类似的东西:

static Dictionary<string, TcpClient> clients = new Dictionary<string, TcpClient>();

//This method is executed in a thread
void ProcessRequest(TcpClient client)
{
   string ip = null;
   //TODO: get client IP address

   lock (clients)
   {
      ...
      if (clients.ContainsKey(ip))
      {
         //TODO: Deny connection
         return;
      }
      else
      {
         clients.Add(ip, client);
      }
   }
   //TODO: Answer the client
}
//TODO: Delete client from list on disconnection

答案 4 :(得分:0)

我们提出的最佳解决方案是创建一个Windows服务,打开一个命名管道,通过与服务器的一个套接字连接来管理多个客户端进程。

然后我们的API将能够检测服务是否正在运行/安装,并回退到为客户端创建自己的连接。

第三方可以决定是否要将服务与其产品捆绑在一起,但我们系统的核心应用程序将安装它。

如果没有更好的选择,我会在几天内将此标记为答案。我希望有一种方法可以将我们的装配作为一个新工艺来执行,但所有这样做的道路看起来都不太可靠。