2015-02-08 135 views
0

在我搜索WebSockets庫時,我遇到了this website,它提供了Delphi和C#版本的下載部分。它吸引了我的注意力,特別是因爲我的應用程序的客戶端是使用Delphi開發的,我試圖用C#開發服務器端。使用靜態包裝類

查看C#聊天示例,我意識到它在Delphi中編寫的非託管DLL周圍使用了一個包裝類(sgcWebSocketLib)。下面是從sgcWebSocketLib.cs摘錄:

public sealed class sgcWebSocketLib 
    { 
     private static volatile sgcWebSocketLib instance; 
     private static object syncRoot = new Object(); 

     private sgcWebSocketLib() 
     { 
     } 

     public static sgcWebSocketLib Instance 
     { 
      get 
      { 
       if (instance == null) 
       { 
        lock (syncRoot) 
        { 
         if (instance == null) 
          instance = new sgcWebSocketLib(); 
        } 
       } 

       return instance; 
      } 
     } 

     ... //the rest is omitted 
} 

,並從開始按鈕,聊天服務器的代碼(典型的WinForms應用程序):

private void btnStart_Click(object sender, EventArgs e) 
{ 
      string vOptions = ""; 
      ... //setting options according to UI values 
      sgcWebSocketLib.Instance.Server_LoadOptions(vOptions); 
      sgcWebSocketLib.Instance.Server_Start(); 
} 

現在,這裏是真正的問題是:這聊天服務器使用sgcWebSocketLib類的static屬性,並開始發送/接收WebSocket的東西。我可以在ASP.Net應用程序(WebForms或MVC)中使用相同的方法嗎?我可以使用這個包裝類在ASP.Net中編寫聊天服務器嗎? PS:我知道有SignalR,也許還有其他的。但它具有一些限制(IIS 8,Windows Server 2012對WebSocket的需求),這與Delphi VCL客戶端的未答覆通信問題相同。

回答

0

在IIS < 8,你將無法綁定WebSocket的端口相同的端口比web應用(這正是IIS8可以做)與IIS8

甚至,在AppDomain是無法回收再利用如果有連接的WebSocket。所以使用@Xeaz提供的信息可能是個好主意。通常,我將它們放在單獨的應用程序中,因爲將面向連接的應用程序(WebSockets)與請求響應(通常的HTTP)混合在一起毫無意義。在IIS8中這樣做的唯一好處是兩者都可以共享端口,但除了打開/映射網絡中的其他TCP端口外,這不是一個真正的問題,因爲Cookie不介意端口,WebSocket不是甚至受到SOP的影響。

如果客戶端正確使用WebSocket協議RFC6455,那麼連接到哪個實現應該沒有關係。我開發了一個websocket server for .NET/Mono 4.5 that works on Windows 7,看看如果你使用.NET服務器選項。

+0

感謝您的詳細解答。所以,如果我想使用你的庫,我應該使用一個單獨的端口呢? – 2015-02-10 09:53:25

+0

對。對於任何不是IIS8內置的WebSocket服務器,您需要提供不同的端口。 – vtortola 2015-02-10 13:51:58

1

是的,你可以。

您只需要注意工作進程的空閒超時設置(默認爲20分鐘)以及回收設置(默認爲每29小時一次)。如果您希望應用程序永遠不會被回收/閒置,則無論其他參數如何,您都可以禁用這兩項設置。

回收/怠速將導致工作進程關閉,因此您將丟失任何靜態變量,並且在進程啓動備份時必須重新實例化它們。

檢查this answer欲知更多信息。