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实现消息推送,也可以将两者组合使用–在进行逻辑处理的同时推送消息。