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

  • 相关阅读:
    Android手机资料拷贝导出工具 --- 91手机助手
    Adobe Acrobat Reader DC For Android 下载
    How to install Wine on Ubuntu Linux 64bit
    Ubuntu 最好用的CHM阅读器KchmViewer
    精品绿色便携软件 & 录制操作工具
    windows 电脑配置信息检测
    彻底理解android中的内部存储与外部存储
    Web标准颜色 System.Drawing.Color
    傲游浏览器---自定义 UserAgent 字符串
    Android direct-boot
  • 原文地址:https://www.cnblogs.com/hnsongbiao/p/8716832.html
Copyright © 2011-2022 走看看