WebAPI提供通用數據接口,SignalR提供實時消息傳輸,兩者可以根據實際業務需求進行組合。
環境 | 版本 |
---|---|
操作系統 | Windows 10 prefessional |
編譯器 | Visual Studio 2015 update3 |
創建WebAPI項目
創建WebAPI項目,使用Nuget為項目添加SignalR類庫。
創建Hub類
SignalR中提供了兩種能實現實時通信的類,PersistentConnection類(持久鏈接)和Hub類(集線器),兩者的區別不多贅述,此處以Hub類為例。
創建類MessageHub,Hub類作為基類。
public class MessageHub : Hub { public void Welcome(string name) { Clients.All.listen(System.DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss") +":"+ name + ":"+Context.ConnectionId); } }
創建WebAPI控制器類
創建WebAPI控制器類BaseApiController作為后續控制器類的基類,此類繼承於ApiController。以泛型的形式引入SignalR的Hub類,同時以接口的形式引入了Hub類中的Clients和Groups,這樣Clients和Groups的相關操作就都能在WebAPI中實現了。
public class BaseApiController<T> : ApiController where T:Hub { protected IHubConnectionContext<dynamic> Clients { get; private set; } protected IGroupManager Groups { get; private set; } protected BaseApiController() { var context = GlobalHost.ConnectionManager.GetHubContext<T>(); Clients = context.Clients; Groups = context.Groups; } }
有了上面的控制器基類后,后面添加的API控制器類只要繼承這個基類就能使用Hub類中的方法了。
public class DemoController: BaseApiController<MessageHub> { [AcceptVerbs("GET")] public async Task<string> GetString() { return await Task.FromResult("Hello"); } [AcceptVerbs("GET")] public async Task SayHello(string name) { string message = string.Format("Hello,{0}!", name); await Clients.All.sayHello(message); } }
相關配置
為了接口調用和實時消息傳輸的方便,最好修改Startup類進行一些跨域的配置。
public class Startup { public void Configuration(IAppBuilder app) { //消息總線--集線器Hub配置 app.Map("/MessageHub",map=> { //SignalR允許跨域調用 map.UseCors(CorsOptions.AllowAll); HubConfiguration config = new HubConfiguration() { //禁用JavaScript代理 EnableJavaScriptProxies = false, //啟用JSONP跨域 EnableJSONP = true, //反饋結果給客戶端 EnableDetailedErrors = true }; map.RunSignalR(config); }); //WebApi允許跨域調用 app.UseCors(CorsOptions.AllowAll); } }
這樣的話,WebAPI和SignalR就集成在同一個項目中了,既可以單獨調用WebAPI接口實現業務邏輯,也可單獨連接SignalR實現消息推送,也可以將兩者組合使用–在進行邏輯處理的同時推送消息。