使用静态包装器 Class

Using Static Wrapper Class

在搜索 WebSockets 库时,我发现 this website 在下载部分提供了 Delphi 和 C# 版本。它引起了我的注意,尤其是因为我的应用程序的客户端是使用 Delphi 开发的,而我正在尝试使用 C# 开发服务器端。

查看 C# 的聊天示例,我意识到它在 Delphi 中编写的非托管 DLL 周围使用了包装器 class (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();
}

现在,真正的问题来了:这个聊天服务器使用 static 属性 的 sgcWebSocketLib class,并启动 sending/receiving WebSocket 东西。我可以在 ASP.Net 应用程序(WebForms 或 MVC)中使用相同的方法吗?我可以使用此包装器 class 在 ASP.Net 中编写聊天服务器吗?

PS:我知道有 SignalR,也许还有其他的。但它有一些限制(IIS 8,Windows Server 2012 对 WebSocket 的要求)除了与 Delphi VCL 客户端的未解决的通信问题。

是的,你可以。

您只需注意工作进程的空闲超时设置(默认为 20 分钟)以及回收设置(默认为每 29 小时一次)。如果您希望您的应用程序永远不会被回收/闲置而不管其他参数如何,您可能需要禁用这两个设置。

回收/空闲将导致工作进程关闭,因此您将丢失任何静态变量,并且必须在进程重新启动时重新实例化它们。

查看 this answer 了解更多信息。

在 IIS < 8 中,您将无法将 WebSocket 端口绑定到与 Web 应用程序相同的端口(这正是 IIS8 可以做的)

即使使用 IIS8,如果连接了 WebSockets,AppDomain 也无法回收。所以使用@Xeaz 提供的信息可能是个好主意。通常我将它们放在单独的应用程序中,因为将面向连接的应用程序 (WebSockets) 与请求-响应应用程序(常规 HTTP)混合使用没有意义。使用 IIS8 这样做的唯一好处是两者都可以共享端口,但这并不是真正的问题,除了 open/map 网络中的一个额外的 TCP 端口,因为 cookie 不介意端口和 WebSocket甚至不受SOP的影响。

如果客户端正确使用 WebSocket 协议 RFC6455,则连接到哪个实现应该无关紧要。我开发了一个 websocket server for .NET/Mono 4.5 that works on Windows 7,如果你使用 .NET 服务器选项,请看一下。