使用静态包装器 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 服务器选项,请看一下。
在搜索 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 服务器选项,请看一下。