在IIS 7.5上使用SignalR WebSockets

24

在我的IIS 7.5上,我的SignalR应用程序总是使用长轮询。根据我的搜索,IIS 7.5尚不支持WebSockets。

我希望我错过了启用IIS 7.5中的WebSockets的一些工具或配置。或者我没有?


我不使用IIS,但是你可以编写自己的服务器(程序),来为你完成这些工作。通过Websockets,你可以从浏览器连接到任何服务器和端口。 - Zaffy
@Zaffy:谢谢。但是,如果WebSockets不可用,我将失去SignalR的自动回退功能。 - ZeroHackeR
这个答案(https://dev59.com/13XYa4cB1Zd3GeqP2BjZ)更详细地解释了为什么你不能使用WebSockets。 - wal
对于那些在2019年遇到这个问题的人来说,IIS 7.5或更早版本不支持使用Web套接字,但是.NET Core / Kestrel可以。在IIS中运行.NET Core无法正常工作,但是单独运行Kestrel可以。 - Timothy Groote
2021年,我的解决方案是:https://learn.microsoft.com/en-us/aspnet/core/fundamentals/websockets?view=aspnetcore-5.0#iisiis-express-support 我需要在Windows Server 2019上启用Web Sockets。 - Kevin Welsh
3个回答

44

你不能在IIS 7.5上(也就是Windows Server 2008 R2或Windows 7上)使用WebSocket,因为它需要HTTP.sys级别的更改。因此,你需要使用IIS 8.0和Windows Server 2012或Windows 8组合来利用WebSocket。另外,IIS Express 8.0也支持WebSocket,但如果你使用低于Windows 8或Windows Server 2012的操作系统,则仍无法利用它。


有没有第三方工具?我正在Win 8上进行开发,但我的服务器在Win Server 2008 R2上。我会与托管提供商联系确认。 - ZeroHackeR
@ZeroHackeR 我不确定,但我相信 StackExchange 使用 WebSocket 技术,并且他们在 Windows Server 2008 R2 上。我不知道他们是怎么做到的。此外,这不仅涉及到你和客户端浏览器,中间任何代理也需要支持 WebSocket。顺便说一下,你的 SignalR 应用程序总是使用长轮询很奇怪。我期望它至少在 IE 中使用 forever-frame 或在其他浏览器中使用 SSE。 - tugberk
1
@ZeroHackeR 一个替代方案可能是使用XSocketS.NET(http://xsockets.net/) - 它完全在IIS之外实现了Web套接字。 - Icarus
奇怪,我使用 WebSocket 已经三天了,一直很好用。现在我进行了许多更改,但是像你说的那样,在 IIS 7.5 上无法使用。 - Lucas Rodrigues Sena

4

IIS 8 Express支持websockets。 新特性

Windows 7被认为是一个低级操作系统,不支持Web Sockets。 已知问题和限制

如果想要支持Web Sockets,请升级到Windows 8!


-19

以下是在 Windows 2008r2 上使用 IIS 7.5 托管所需的设置步骤摘要:

更新 SignalR 应用程序的 web.config 文件,以启用“运行所有托管模块以处理所有请求”(简称 RAMMFAR 设置)。

更新使用 SignalR 的网页以与服务器通信: 添加对 json2.js 库的引用。 添加一个标签,强制内容在最新的浏览器模式下显示。

安装IIS 7.5的Windows Server 2008r2如下: 安装您的SignalR应用程序所需的.NET Framework版本。 创建一个站点并将其与适当的应用程序池关联。

更新Signalr应用程序的Web.config文件

在SignalR应用程序的web.config文件中,添加RAMMFAR设置以启用所有请求的所有托管模块运行。这个设置是必需的,以便在Windows 2008r2和IIS 7.5上的所有浏览器中运行SignalR示例应用程序。

<system.webServer>
   <modules runAllManagedModulesForAllRequests="true">
   </modules>
</system.webServer> 

更新使用SignalR的Web页面

在使用SignalR与服务器通信的应用程序Web页面中,添加以下代码。

添加对json2.js JSON解析器库的引用。该脚本为以前没有JSON解析器的浏览器版本提供了一个JSON解析器。您可以通过以下两种方式之一添加脚本: 将NuGet包json2.js添加到您的项目中,然后在Web页面中引用它:

或者作为替代方案,在CDN上引用json2.js:

在页面的head部分添加以下标签。这个标签,特别是IE=edge值,强制Internet Explorer显示最新可用版本的内容,而不是早期模式(如IE7),这些模式会阻止SignalR代码工作。

设置Windows Server 2008r2和IIS 7.5

正如所述,我从.NET 4的SignalR入门教程中构建了示例SignalR应用程序。这是Windows 2008r2和IIS 7.5上常见的托管场景。服务器是一个新的默认安装的Windows Server 2008r2和IIS 7.5。

安装所需的.NET Framework版本。在这种情况下,我安装了.NET Framework 4。

在IIS Manager中创建一个新站点,并将该站点与应用程序池关联。使用集成模式应用程序池,不支持SignalR的经典模式。对于此应用程序,我使用了ASP.NET v4.0应用程序池。

按照上述设置步骤后,我能够将基于.NET Framework 4的Getting Started with SignalR示例部署到服务器,并且它在IE(8、9和10版本)、Chrome和Firefox中完美运行,即使它使用回退传输方法(在IE中为永久帧,在其他浏览器中为服务器发送事件)。对于SignalR开发人员来说,有趣的是除了上述步骤外,我没有在应用程序中的任何SignalR代码中更改一行代码就可以使其工作。

这只是一个简单的案例,但表明SignalR确实支持在服务器上不支持WebSockets支持时自动回退到早期的传输机制。


9
这个回答没有涉及如何在IIS 7.5中使用websockets,因为这是不可能的。 - vtortola
2
我简直不敢相信在意识到他在回避问题之前,我已经读了一半的废话。可惜它被标记为答案。 - Brunis
1
我对这个答案进行了负评,因为它回答了错误的问题 - 其他答案是正确的。 - crimbo
1
不应该标记为答案。它没有展示如何使用WebSocket。据我所知,这是不可能的。 - mCasamento
1
WebSocket协议在IIS 7.5中不受支持。 WebSocket协议在IIS 8.0中引入。 http://www.iis.net/learn/get-started/whats-new-in-iis-8/iis-80-websocket-protocol-support - JJS
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接