WebAPI集成SignalR

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

posted @ 2018-04-04 13:45  三人成虎  阅读(4765)  评论(0编辑  收藏  举报