2010-06-07 70 views
4

我們目前正在爲現有系統開發API。定製API要求

它基本上包裝一些網絡請求作爲一個易於使用的庫,第三方公司應該能夠與我們的產品使用。

作爲API的一部分,有一個事件機制,其中的服務器可以通過不斷運行的套接字連接調用返回給客戶端。

爲了儘量減少服務器上的負載,我們希望每臺計算機只有一個連接。目前,每個進程都有一個套接字打開,如果您有多個使用API​​的應用程序,最終可能會導致加載問題。

所以我的問題是:如果我們希望我們的API部署爲單個獨立組件,什麼是解決我們問題的最佳方式是什麼?

一對夫婦的選擇,我們認爲:

  • 寫的進程外的COM對象的(不知道是否在.net中工作)
  • 包括將需要事件第二個exe文件,那就要單實例本身,並打開一個命名管道或東西通過多個進程
  • 摘自嵌入的資源溝通這個exe文件,並執行它

無那些真的很理想。

有什麼更好的點子?

+2

如何在後臺運行Windows服務? – dtb 2010-06-07 18:34:47

+0

這與部署一個EXE以及程序集類似,但需要更多的工作。我們希望第三方能夠通過引用程序集來使用我們的API部署應用程序。我們最終可能會走這條路線並建立一個msi/merge-module,第三方將不得不與他們的應用程序一起安裝。 – jonathanpeppers 2010-06-07 18:41:30

+0

@Jonathan:請不要在標題中重複標記(「C#.Net」)。 – 2010-06-07 18:51:57

回答

0

我們已經想出了最好的解決方案是創建開闢了一個命名管道通過一個套接字連接到服務器來管理多個客戶端進程windows服務。

然後我們的API就可以,如果服務正在運行/安裝檢測並回落到創建它的客戶端,否則自己的連接。

第三方可以決定是否要與他們的產品或不捆綁服務,但是從我們的系統核心應用程序將它安裝在。

如果沒有人有更好的選擇,我會在幾天內將此標記爲答案。我希望有一種方法來執行我們的組裝作爲一個新的過程,但所有的道路這樣做似乎並不可靠。

0

你的意思是類似於Net.TCP port sharing

+0

我應該提到另一個要求:我們的API只需要.Net 2.0來支持更廣泛的第三方觀衆。這意味着WCF不可能被使用,我們正在通過HttpWebRequest或Socket類來處理事件。 – jonathanpeppers 2010-06-07 18:45:54

0

您可以修復客戶端端口,同時打開你的插座,說45534.由於一個端口只能由一個進程打開,只能有一個時間過程將能夠打開套接字連接到服務器。

+0

客戶端沒有收聽,我們的應用程序無法通過防火牆。客戶端在服務器上建立一個連接並等待服務器返回的輸出,這就是我們事件的工作方式。 – jonathanpeppers 2010-06-08 13:08:59

0

那麼,有很多方法可以解決這個問題,就像所有答案和評論中所表達的一樣,但是可能更簡單的方法就是將全局狀態存儲在當前機器所有用戶可訪問的地方(可能你可能有不同的用戶在機器上登錄)你存儲在哪裏世衛組織有權利公開。就像過去被稱爲「鎖」的東西。該商店可以是本地或Intranet數據庫中的字段,簡單文件或其他任何內容。這樣你就不需要構建或分發額外的二進制文件。

+0

我想你假設這個API是隻讀的,不會改變。我們的API提供實時數據,併爲第三方提供修改數據的能力。 API也可以提供實時事件,這就是我們的問題所在。 – jonathanpeppers 2010-06-08 13:23:03

+0

我明白了,是的,我假定您的API中不存在不變性。那麼,如果我必須選擇已經表達的選項之一,我認爲更清晰的選項是有一個單獨的進程(服務或不是)管理每臺機器到服務器的連接,然後添加到通信協議的能力確定哪個客戶端進程是實時事件。而且,這個額外的層可以讓你在將來輕鬆地擴展邏輯(假設啓用第二個通信通道)。如果你選擇這個選項,記住這一點,網絡和服務器將在未來加速。 – someone 2010-06-08 18:38:12

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 
+0

我們在服務器上的實現是不相關的(並且是一個Linux服務器,不使用任何類似C#(單聲道)BTW)。我們想要處理的問題是將客戶端打開的連接數減少到每臺機器1個。我們希望這樣做,因爲客戶端PC可能一次使用我們的API有10-15個應用程序。 – jonathanpeppers 2010-06-09 15:06:12