使用静态包装类

时间:2015-02-08 10:43:25

标签: c# asp.net delphi websocket

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

查看C#的Chat示例,我意识到它在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和其他人。但除了Delphi VCL客户端未解决的通信问题之外,它还有一些限制(IIS 8,Windows Server 2012对WebSocket的要求)。

2 个答案:

答案 0 :(得分:1)

是的,你可以。

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

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

查看this answer了解详情。

答案 1 :(得分:0)

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

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

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