.NET 4.5 中的 Websocket

Posted

技术标签:

【中文标题】.NET 4.5 中的 Websocket【英文标题】:Websockets in .NET 4.5 【发布时间】:2013-03-25 07:10:41 【问题描述】:

我想开发一个 Web 应用程序,其中客户端调用服务器上的服务来执行一些涉及一些处理的操作。服务器将进行所有必要的处理,当更新的数据准备好时,它将将该数据推送到客户端。目前我正在考虑两种方法: - 1. 使用带有 SignalR 的 ASP.NET WEB API 2. 在 .NET 4.5 中将 WebSockets 与 WCF 结合使用。

我的服务器将在 Windows Server 2012 上,但我的大多数客户端将是 IE 9,我认为它不支持 WebSockets。

正如 SignalR 文档中所写,如果在不更改应用程序代码的情况下不存在 WebSockets 支持,它会自动落入长轮询。 .NET 4.5 中的 WebSockets 是否也支持这一点,或者我必须手动完成。表示我是否必须在服务器上同时实现 Pull 方法和 push 方法。

请指导我,我将采用哪种方法。

在以后的用例中,我想使用 PhoneGAP 构建这个 Web 应用程序,以创建适用于 iosandroid 和 Windows Phone 的移动应用程序。

【问题讨论】:

【参考方案1】:

WebSockets 不会退回到长轮询(这没有任何意义)。 SignalR 是对 http 传输的更高级别的抽象,这就是它执行回退和其他事情的原因(例如通过连接提供一个很好的编程模型)。

如果您选择在 ASP.NET 上使用 websockets(不确定 WCF),您将针对原始套接字进行编程(这意味着读取/写入数组段等),并且很难做到这一点。 SignalR 会为您执行此操作,并且如果客户端或服务器上的 websockets 不可用,它将回退到其他几种传输方式(永久帧、服务器发送事件、长轮询)。

关于客户端,如果您选择使用 SignalR,则需要使用 SignalR 客户端。我们仅支持 javascript 和 .NET(silverlight、windows phone 8、winrt、.NET 4 和 .NET 4.5)。有些人为包括 iOS 和 Android 在内的其他平台编写了客户端,但我们不维护它们,所以我无法说明它们的最新程度。

我建议您使用 SignalR,这样您就可以专注于应用程序逻辑,而不是搞乱 websocket 的低级编程模型。

【讨论】:

为什么 windows phone 8 不能通过 SignalR 中的 Web 套接字连接? 因为windows phone 8中没有websocket API @dfowler 不过有一个socket api,所以这不是借口。 当然,似乎没有人写过,我们也没有写过。我们确实接受拉取请求【参考方案2】:

您可以从 ASP.NET 教程http://www.asp.net/signalr/overview/getting-started/tutorial-getting-started-with-signalr开始

通过本教程,您将了解有关 SignalR 需要了解的所有基本知识

【讨论】:

感谢 Ivo,但我想比较这两种方法。 .NET 4.5 中的 SignalR 和 WebSocket。如果环境不支持 WebSockets 或者我必须手动处理,.NET 4.5 中的 WebSockets 是否也会退回到长轮询。 .net (***.com/questions/9537641/…) 有几个开源 websocket 库,请参阅未标记的答案。据我所知,不要像信号器那样回退。 SignalR 为旧版浏览器提供了 3 或 4 个回退。另见***.com/questions/9524591/…【参考方案3】:

我可以确认后备系统会自动运行。如果不能使用 websockets 传输,将使用 ServersentEvents 传输..等等..最后一个传输协议是 longpolling。

我们的 SignalR 服务器是一个 .NET 4.5 框架应用程序,托管在一个 ASP.NET MVC 应用程序中,使用 Windows 2012 服务器上的 4.5 dll。应用程序池是 ASP.NET 4.0。

Windows 8 或 Windows 2012 服务器上的 .NET 4.5 客户端似乎使用 websocket。 Windows 7 计算机上的相同 .NET 客户端(即使安装了框架 4.5)自动回退到服务器发送事件传输。

在浏览器上使用 Signalr javascript 客户端时,会发生类似的事情:

Chrome/Safari/其他支持 websockets 的浏览器似乎使用 websockets。 IE/其他不支持 websockets 但版本相对较晚的浏览器似乎使用 serverentevents。

根据经验,serverentevents 并不是很糟糕,因此如果不使用 websockets,请不要犹豫,当然也不要将其作为反对使用 signalR 的唯一因素,因为好处很多。

希望这会有所帮助。

【讨论】:

以上是关于.NET 4.5 中的 Websocket的主要内容,如果未能解决你的问题,请参考以下文章

.NET 4.5 中的 Websocket

.NET 6 中的 .NET Framework 4.5 / .NET Standard 1.0 支持

ASP.NET 4.5 或替代框架中的 OpenIdDict?

.Net 4.5 标准中的 SAML 2.0 协议支持

EF5 和 .NET 4.5 中的未映射错误

为啥 .Net 4.0 构建客户端 DataContracts 会导致 .Net 4.5 应用程序中的 MethodAccessException?