【问题标题】:SignalR WebSockets on IIS 7.5IIS 7.5 上的 SignalR WebSockets
【发布时间】:2012-12-17 04:36:18
【问题描述】:

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

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

【问题讨论】:

  • 我不使用 IIS,但您可以编写自己的服务器(程序)来为您完成这些工作。使用 websockets,您可以从浏览器连接到任何服务器和端口。
  • @Zaffy:谢谢。但是,如果 WebSockets 不可用,我将失去 SignalR 的自动回退功能。
  • 这个答案stackoverflow.com/questions/17957949/… 解释了为什么你不能更详细地了解其他答案
  • 对于那些在 2019 年遇到这种情况的人,IIS 7.5 或更早版本不会让您使用 Web 套接字,但 .net core / kestrel 会。在 IIS 中运行 .net core 不起作用,但单独运行 kestrel 可以。
  • 在 2021 年,我的解决方案是:docs.microsoft.com/en-us/aspnet/core/fundamentals/… 我需要在我的 Windows Server 2019 上启用 Web Sockets

标签: websocket iis-7.5 real-time signalr


【解决方案1】:

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

【讨论】:

  • 有第三方工具吗?我在 Win 8 上进行开发,但我的服务器在 Win Server 2008 R2 上。我将与托管服务提供商核实。
  • @ZeroHackeR 我不知道,但我相信 StackExchange 使用 WebSocket 技术并且它们在 Windows Server 2008 R2 上。我不知道他们是怎么做到的。此外,这不仅仅是关于您和您的客户的浏览器。中间的任何代理也需要支持 WebSocket。顺便说一句,奇怪的是您的 SignalR 应用程序总是使用长轮询。我希望它在其他浏览器中的 IE 或 SSE 中至少使用永久框架。
  • @ZeroHackeR 一种替代方法是使用 XSocketS.NET (xsockets.net) - 它完全在 IIS 之外实现 Web 套接字。
  • 奇怪,我使用 websocket 3 天,工作良好,现在我开发了很多更改,但我不能像你说的那样在 IIS 7.5 上使用。
【解决方案2】:

IIS 8 Express 支持 websockets New Features

Windows 7 被视为低级操作系统,不支持 Web 套接字。 Known Issues and Limitations

如果您想支持 Web 套接字,是时候升级到 Windows 8 了!

【讨论】:

    【解决方案3】:

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

    Update the SignalR application's web.config file 启用“为所有请求运行所有托管模块”(简称为 RAMMFAR 设置)。

    Update the web page that uses SignalR 与服务器通信: 添加对 json2.js 库的引用。 添加一个标签,强制内容以最近的浏览器模式显示。

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

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

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

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

    更新使用 SignalR 的网页

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

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

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

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

    设置 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 管理器中创建一个新站点,并将该站点与应用程序池相关联。使用集成模式应用程序池,SignalR 不支持经典模式。对于这个应用程序,我使用了 ASP.NET v4.0 应用程序池。

    按照上述设置步骤后,我能够将基于 .NET Framework 4 版本的 SignalR 入门示例部署到服务器,它在 IE(版本 8、9 和 10)中运行良好, Chrome 和 Firefox,即使它使用后备传输方法(IE 中的永久帧,以及其他浏览器中的服务器发送事件)。 SignalR 开发人员的有趣之处在于,除了上述步骤之外,我无需在应用程序的任何位置更改任何一行 SignalR 代码即可完成这项工作。

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

    【讨论】:

    • 这个答案没有解决如何在 IIS 7.5 中使用 websockets,只是因为不可能。
    • 在意识到他在回避这个问题之前,我简直不敢相信我读了一半的废话。可惜它被标记为答案。
    • 我否决了这个答案 b/c 它回答了错误的问题 - 其他答案是正确的。
    • 不应被标记为答案。它没有显示如何使用 websocket。 AFAIK 这是不可能的
    • IIS 7.5 不支持 WebSocket 协议。 WebSocket 协议是在 IIS 8.0 中引入的。 iis.net/learn/get-started/whats-new-in-iis-8/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-07
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多