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

  • 相关阅读:
    navicat连接虚拟机中mysql"Access denied for user'root'@'IP地址'"问题
    Centos6.4 + mysql-5.6.38-linux-glibc2.12-x86_64.tar 实现mysql主从复制
    三、mock测试技术
    二、数据加密
    一.unittest框架初识
    3.Allure报告
    2.pytest参数化
    1.pytest框架初识
    RabbitMQ 几种工作模式---(三) Publish/Subscribe
    RabbitMQ 几种工作模式---(二)work
  • 原文地址:https://www.cnblogs.com/hnsongbiao/p/8716832.html
Copyright © 2020-2023  润新知