在我搜索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中编写聊天服务器吗?
答案 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服务器选项,请看一下。