我目前正在使用Alchemy Websockets作为我的WebSocket解决方案,但事实证明这是一种痛苦,因为我花了很多时间试图弄清楚为什么我无法解决这个问题在我的WebRole上(包括Compute Emulator和cloudapp.net本身)。它在本地运行 okay 。
我知道this question that was asked previously,我已经按照代码中的所有内容完成了所有建议,所以我无法理解为什么我仍然无法连接到我的WebSocket服务器。我尝试使用WebSocket.org's Echo Test和Android客户端进行连接(利用Autobahn)。考虑到两种方式都不起作用,我更确定它不再是客户端问题,而是更多的服务器端问题(什么阻止我在Azure上打开WebSocket服务器?!)。
总之,到目前为止我做了什么:
Global.asax
启动WebSocket服务器如果有帮助,我之前尝试过SuperWebSocket Server。据我所知,创建者Kerry Jiang已经上传了一些Azure样本,但是Command Assembly令我感到困惑,我不希望在我的应用程序中使用那种额外的逻辑(我只想要一些我可以即插即用的东西),所以我决定完全放弃了。
Alchemy Websockets和SuperWebSocket服务器在本地工作得非常好,但是当它在Azure上时(无论是在cloudapp.net上传的模拟器)我似乎都无法连接。任何指导请...?
答案 0 :(得分:3)
将WebSocket与云托管的虚拟机一起使用时,可能会出现许多问题:
云服务可能具有防火墙,默认情况下阻止任何(非标准)端口。在Amazon EC2上,您可以通过AWS管理控制台配置开放(未阻止)入站端口,以及适用于运行WS服务器的EC2实例的“安全组”的相应配置。
即使您使用标准Web端口(如80)并且此端口在防火墙中处于打开状态,也可能存在代理,负载均衡器或其他所谓的不支持WebSocket的中介。
当在非本地网络上运行时,会有各种可能会干扰的中介。例如,移动网络服务提供商的中介对于WebSocket来说过于愚蠢(它使用HTTP 标准升级机制......它是标准的..但是那里有很多破碎的东西)。
要解决2.和3.(以及一般情况而言),您可能希望在生产中通过TLS(安全WebSocket .. WSS)运行WebSocket。通过TLS运行,并终止服务器上的TLS连接 ,没有中介可以干扰(甚至在这里有例外...所谓的MITM HTTPS代理解包TLS ..但仅限于某些公司网络并依赖代理能够在用户的浏览器中动态安装证书。
要建立健壮的WSS连接,您必须确保浏览器接受使用的服务器证书没有任何问题。如果它是自签名的,例如,浏览器通常不会接受,但询问用户是否仍然想要接受。使用WS,浏览器将不会呈现此类对话框,因为WS是所谓的“子资源”。因此:确保您的证书100%正确。
完成5.完成后,WebSocket(WSS然后),将一直工作(几乎)。移动,企业,公共互联网。