带有Web套接字的SignalR
本文关键字:SignalR 套接字 Web 带有 | 更新日期: 2024-06-14 07:48:52
我正试图让websocket在我的开发环境中工作:
- Visual Studio 2010
- Windows 7
- 信号R 0.51
- 最新Chrome/Firefox
不幸的是,Javscript客户端正在使用长轮询。当我在客户端强制使用网络套接字时,我根本无法连接:
$.connection.hub.start({ transport: ['webSockets'] })
服务器代码是自托管的,基于示例,看起来像:
static void Main(string[] args)
{
string url = "http://localhost:8081/";
var server = new Server(url);
// Map the default hub url (/signalr)
server.MapHubs();
// Start the server
server.Start();
Console.WriteLine("Server running on {0}", url);
// Keep going until somebody hits 'x'
while (true)
{
ConsoleKeyInfo ki = Console.ReadKey(true);
if (ki.Key == ConsoleKey.X)
{
break;
}
}
}
public class MyHub : Hub
{
public void Send(string message)
{
Clients.addMessage(message);
}
}
我到处找了找,没有找到确切的结果。我是否需要指定一些额外的东西,使用Visual Studio 2012,或者这只适用于Windows 8/IIS 8?
即使在Windows8/.NET4.5上,它最初也不起作用,但有了这些额外的提示,我终于让它起作用了。
-
安装websocket支持
-> Turn Windows features on or off -> Internet Information Services -> World Wide Web Services -> Application Development Features -> WebSocket Protocol
-
在web.config的appSettings下,添加以下设置:
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
SignalR自动协商websocket,不必指定,代码中也不需要任何特殊的东西。
基于此答案https://stackoverflow.com/a/9135334/700926你会看到SignalR中的WebSocket支持依赖于Windows8/IIS8——答案也指向SignalR的github页面上的一个wiki页面,然而,该页面已经不存在了。
但是,通过在github上克隆wiki repo并返回一些修订版,您将看到SignalR.WebSockets
项目的文档,根据SignalR的github页面,该文档已不存在-(这可能解释了wiki网站被删除的原因)-然而,在今年2月对SignalR.WebSockets
的wiki页面进行的修订中,它指出:
SignalR.WebSockets包可以添加到现有的SignalR项目中,以允许客户端使用WebSocket进行连接协议SignalRjQuery客户端将自动尝试通过WebSockets进行连接(如果浏览器支持),因此客户端无需进行任何更改侧,将WebSockets添加到基于SignalR的应用程序中。
SignalR.WebSockets依赖Microsoft.WebSockets以便侦听来自内部的传入WebSocket连接ASP.NET。此包又依赖于新的WebSockets支持已添加到ASP.NET 4.5和IIS 8.0中。因此SignalR.WebSockets包只能在Windows 8计算机(.NET4.5将安装在早期版本的Windows上,但IIS 8.0需要Windows 8)。有关如何设置Windows的详细信息8机器(使用开发者预览)请参阅在这里
我试着搜索比我上面所能提供的信息更新的信息,但据我所知,SignalR wiki在其当前版本中没有明确涵盖这个主题。
Signal R也适用于Windows 7、IIS 7.5和Visual Studio 2012。唯一的缺点是它将使用longPolling作为传输协议。
为了在上述配置中成功地使用signalR,我们需要设置一些内容,这些内容在任何signalR教程中都没有详细说明。
因此,在服务器端(win7,IIS 7.5),当您创建连接和代理时,您必须执行以下操作:
Connection = new HubConnection('someUrl', false);
Proxy = Connection.CreateHubProxy('myHubProxy');
Connection.Start(new LongPollingTransport()).Wait(); // notice the specification of transport
当然,在客户端,您必须以相同的方式将传输协议指定为"longPooling":
var connection = $.hubConnection('myUrl', { useDefaultPath: false });
connection.start({ transport: ['websockets', 'longPolling'], jsonp: true, xdomain: true })
除了上述解决SignalR中WebSockets问题的解决方案外,如果您在公司网络(或类似结构的网络)中,您的代理和防火墙很可能会干扰握手。
但是,如果您通过SSL访问它,它提供的包装器在许多情况下会保护它免受这种干扰。