代码之家  ›  专栏  ›  技术社区  ›  jonathanpeppers

自定义API要求

  •  4
  • jonathanpeppers  · 技术社区  · 15 年前

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

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

    作为API的一部分,有一个事件机制,在这个机制中,服务器可以通过一个不断运行的套接字连接回调到客户机。

    为了最小化服务器上的负载,我们希望每台计算机只有一个连接。当前每个进程都有一个打开的套接字,如果有多个应用程序使用该API,那么最终可能会导致加载问题。

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

    我们考虑了几个选择:

    • 编写进程外COM对象(不知道它是否在.NET中有效)
    • 包括事件所需的第二个exe文件,它必须单个实例本身,并打开一个命名管道或其他东西以通过多个进程进行通信。
    • 从嵌入的资源中提取此exe文件并执行它

    这些看起来都不太理想。

    有更好的主意吗?

    5 回复  |  直到 15 年前
        1
  •  0
  •   ChrisLively    15 年前

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

        2
  •  0
  •   apoorv020    15 年前

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

        3
  •  0
  •   someone    15 年前

    好吧,有很多方法可以解决这个问题,正如所有答案和评论中所表达的那样,但可能更简单的方法是,将全局状态存储放在当前计算机的所有用户都可以访问的位置(可能是您有多个用户登录到了该计算机),您存储的用户有权打开它。像以前被称为“锁”的东西。该存储可以是本地或Intranet数据库中的字段、简单文件或其他内容。这样就不需要构建或分发额外的二进制文件。

        4
  •  0
  •   Eduardo    15 年前

    当客户机连接到您的服务器时,您将创建一个新线程来处理它(而不是一个进程)。您可以将他的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
    
        5
  •  0
  •   jonathanpeppers    15 年前

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

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

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

    如果没有人有更好的选择,我会在几天内把这个标记为答案。我本来希望有一种方法可以把我们的集会作为一个新的过程来执行,但所有的道路似乎都不太可靠。