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實現消息推送,也可以將兩者組合使用–在進行邏輯處理的同時推送消息。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM