asp.net core 2.0 webapi整合signalr

來源:互聯網
上載者:User

標籤:null   .net   引用   sign   基本   nbu   inpu   接收   gif   

  

在部落格園也很多年了,一直未曾分享過什麼東西,也沒有寫過部落格,但自己也是汲取著部落格園的知識成長的;

這兩天想著不能這麼無私,最近.NET CORE貌似挺流行的,閑來無事也自己搞了個asp.net core signalr

部落格園裡面也有人在.net core 2.0下面整合了signalr,但是是整合在同一個項目裡面的,但是大家都知道我們很多的項目都是分離的;

而且signalr涉及到串連數和記憶體資源的佔用問題,如果都整合在一個項目裡面當訪問量多大的時候容易造成網站訪問緩慢,具體原因就不多說了

所以我這裡做了一個在.net core webapi裡面整合signalr,我們就可以通過調用webapi來實現伺服器向用戶端推送訊息

第一步引用nuget:Mrcrosoft.AspNetCore.SignalR

 

第二步添加配置代碼:

首先ConfigureServices裡面添加如下代碼:

public void ConfigureServices(IServiceCollection services)        {            services.AddSignalR();            services.AddCors(options =>            {                options.AddPolicy("SignalrCore",                    policy => policy.AllowAnyOrigin()                                    .AllowAnyHeader()                                    .AllowAnyMethod());            });            services.AddSingleton<IServiceProvider, ServiceProvider>();        }

然後Configure裡面添加

public void Configure(IApplicationBuilder app, IHostingEnvironment env)        {            if (env.IsDevelopment())            {                app.UseDeveloperExceptionPage();            }            //跨域支援            app.UseCors("SignalrCore");            app.UseSignalR(routes =>            {                routes.MapHub<SignalrHubs>("signalrHubs");            });            app.UseWebSockets();            app.UseMvc();        }

 

然後我們添加一個hubs

public class SignalrHubs:Hub    {        /// <summary>        /// 建立signalr連結        /// </summary>        /// <param name="parentId">pid(作為使用者組)</param>        /// <param name="shopId">sid</param>        public Task InitUser(string parentId, string shopId)        {            Groups.AddAsync(Context.ConnectionId, parentId);            SignalrGroups.UserGroups.Add(new SignalrGroups()            {                ConnectionId = Context.ConnectionId,                GroupName = parentId,                ShopId = shopId            });            return Clients.All.InvokeAsync("NoticeOnline", "使用者組資料更新完成,新增id為:" + Context.ConnectionId + " pid:" + parentId + "   sid:" + shopId + "");        }        public override Task OnDisconnectedAsync(Exception exception)        {            //掉線移除使用者            var user = SignalrGroups.UserGroups.FirstOrDefault(c => c.ConnectionId == Context.ConnectionId);            if (user != null)            {                SignalrGroups.UserGroups.Remove(user);                Groups.RemoveAsync(Context.ConnectionId, user.GroupName);            }            return base.OnDisconnectedAsync(exception);        }    }

PS:我這裡是根據本人業務需要來做的,大家可以修改成其他的(使用者量大的時候記憶體佔用肯定高,這裡只做一個簡單的例子)

以上基本的環境搭建就已經完成了

接下來控制器裡面的代碼

[Produces("application/json")]    [Route("api/MRSoftPush")]    public class MRSoftPushController : Controller    {        private IHubContext<SignalrHubs> hubContext;        public MRSoftPushController(IServiceProvider service)        {            hubContext = service.GetService<IHubContext<SignalrHubs>>();        }        [HttpGet]        public string Get()        {            return DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:ffff");        }        /// <summary>        /// 單個connectionid推送        /// </summary>        /// <param name="groups"></param>        /// <returns></returns>        [HttpPost,Route("AnyOne")]        public IActionResult AnyOne([FromBody]IEnumerable<SignalrGroups> groups)        {            if (groups != null && groups.Any())            {                var ids = groups.Select(c=>c.ShopId);                var list = SignalrGroups.UserGroups.Where(c=>ids.Contains(c.ShopId));                foreach (var item in list)                    hubContext.Clients.Client(item.ConnectionId).InvokeAsync("AnyOne", $"{item.ConnectionId}: {item.Content}");            }            return Ok();        }        /// <summary>        /// 全部推送        /// </summary>        /// <param name="message"></param>        /// <returns></returns>        [HttpGet,Route("EveryOne")]        public IActionResult EveryOne(string message)        {            hubContext.Clients.All.InvokeAsync("EveryOne", $"{message}");            return Ok();        }        /// <summary>        /// 組推送        /// </summary>        /// <param name="group"></param>        /// <returns></returns>        [HttpPost,Route("AnyGroups")]        public IActionResult AnyGroups([FromBody]SignalrGroups group)        {            if (group != null)            {                hubContext.Clients.Group(group.GroupName).InvokeAsync("AnyGroups", $"{group.Content}");            }            return Ok();        }        /// <summary>        /// 多參數接收方式        /// </summary>        /// <param name="message"></param>        /// <returns></returns>        [HttpGet,Route("MoreParamsRequest")]        public IActionResult MoreParamsRequest(string message)        {            hubContext.Clients.All.InvokeAsync("MoreParamsRequest", message, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:ffff"));            return Ok();        }    }

伺服器端的代碼到這裡全部完成,接下來咱們看用戶端的代碼

我的用戶端代碼是在另外一個項目裡面,和伺服器端是分離的

<input type="text" id="ParentId" placeholder="ParentId" /><br /><input type="text" id="ShopId" placeholder="ShopId" /><br /><button id="fuckyou">使用者上線</button><br /><br /><br /><ul id="message" style="color:red;"></ul>@section scripts {    <script>        $(function () {            let hubUrl = ‘http://192.168.0.149:8009/signalrHubs‘;            let httpConnection = new signalR.HttpConnection(hubUrl);            let hubConnection = new signalR.HubConnection(httpConnection);            $("#fuckyou").click(function () {                hubConnection.invoke(‘InitUser‘, $("#ParentId").val(), $("#ShopId").val());            });            hubConnection.on(‘NoticeOnline‘, data => {                $("#message").append("<li>" + data + "</li>");            });            hubConnection.on(‘EveryOne‘, data => {                $("#message").append("<li style=\"color:red;\">全部推送:" + data + "</li>");            });            hubConnection.on(‘AnyGroups‘, data => {                $("#message").append("<li style=\"color:black;\">單個使用者組推送:" + data + "</li>");            });            hubConnection.on(‘AnyOne‘, data => {                $("#message").append("<li style=\"color:blue;\">單個ID推送:" + data + "</li>");            });            hubConnection.on(‘MoreParamsRequest‘, (message, date) => {                $("#message").append("<li style=\"color:green;\">多參數接收:" + message + " : " + data + "</li>");            });            hubConnection.start();        });    </script>}

頁面上引用連個js

<script src="/js/signalr-client.min.js"></script>
<script src="/js/jquery.min.js"></script>

 

到這裡基本就已經完成了,下面看一下運行效果

 

第一次寫部落格,有點緊張,代碼寫得比較倉促,很多細節都沒有最佳化,有很多不足之處,望各位多多指正

 

asp.net core 2.0 webapi整合signalr

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.