新手首次使用可使用Nuget下载实例代码:搜索:Microsoft.AspNet.SignalR.Sample
SignalR官方说明:
https://docs.microsoft.com/en-us/aspnet/signalr/overview/getting-started/introduction-to-signalr
SignalR好处显而易见, 就是说哪怕是的项目是.net3.0 开始就使用SignalR,你以后升级成.net4.5了, 你想用websocket你可以直接升级, 因为SignalR会帮你选择你不需要关心。
注意事项:
- 在SignalR中使用websocket
但是如果需要在SignalR中使用websocket必须满足:
- 浏览器支持
- 新的Windows运行时 (win server 12 和win10)
- IIS 8.0
- .NET 4.5
- ASP.NET
- WCF
- HttpListener
服务器中安装websocket及注意事项:https://docs.microsoft.com/en-us/iis/get-started/whats-new-in-iis-8/iis-80-websocket-protocol-support
装完后需要在webconfig中增加:
<system.web> <httpRuntime targetFramework="4.5" /> </system.web>
- 在SignalR中使用长轮询
如果SignalR服务和应用服务 不在同一个服务器 需要使用JsonP解决跨域问题:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using Microsoft.Owin; using Owin; using Microsoft.AspNet.SignalR; using Microsoft.Owin.Cors; [assembly: OwinStartup(typeof(***.Startup))] namespace *** { public class Startup { public void Configuration(IAppBuilder app) { /*如何处理错误:在服务器上显式启用详细的错误消息 客户端:添加事件的处理程序 hubConnection.Error += ex => Console.WriteLine("SignalR error: {0}", ex.Message); */ app.Map("/signalr", map => { // Setup the CORS middleware to run before SignalR. // By default this will allow all origins. You can // configure the set of origins and/or http verbs by // providing a cors options with a different policy. map.UseCors(CorsOptions.AllowAll); var hubConfiguration = new HubConfiguration { // You can enable JSONP by uncommenting line below. // JSONP requests are insecure but some older browsers (and some // 长轮询跨域 (不使用直接注销) //EnableJSONP = true }; // Run the SignalR pipeline. We're not using MapSignalR // since this branch already runs under the "/signalr" // path. map.RunSignalR(hubConfiguration); }); } } }
以下列表显示了SignalR使用哪些步骤来决定要使用的传输。
- 如果浏览器是Internet Explorer 8或更早版本,则使用长轮询。
- 如果配置了JSONP(即,连接启动时
jsonp
参数设置为true
),则使用长轮询。如果正在进行跨域连接(即,如果SignalR端点与主机页面不在同一个域中),则如果满足以下条件,则将使用WebSocket:
- 客户端支持CORS(跨源资源共享)。有关哪些客户端支持CORS的详细信息,请参阅caniuse.com上的CORS。
- 客户端支持WebSocket
服务器支持WebSocket
如果不符合上述任何一个标准,将使用长轮询。有关跨域连接的更多信息,请参阅如何建立跨域连接。
- 如果未配置JSONP并且连接不是跨域,则如果客户端和服务器都支持,则将使用WebSocket。
- 如果客户端或服务器不支持WebSocket,则可以使用服务器发送事件。
- 如果服务器发送事件不可用,则尝试使用永久帧。
- 如果Forever Frame失败,则使用Long Polling。