最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

asp.net core 2.0 webapi集成signalr(實(shí)例講解)

 更新時(shí)間:2017年11月26日 09:05:08   作者:Mr.落葉  
下面小編就為大家分享一篇asp.net core 2.0 webapi集成signalr的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

在博客園也很多年了,一直未曾分享過(guò)什么東西,也沒(méi)有寫(xiě)過(guò)博客,但自己也是汲取著博客園的知識(shí)成長(zhǎng)的;

這兩天想著不能這么無(wú)私,最近.NET CORE貌似挺流行的,閑來(lái)無(wú)事也自己搞了個(gè)asp.net core signalr

博客園里面也有人在.net core 2.0下面集成了signalr,但是是集成在同一個(gè)項(xiàng)目里面的,但是大家都知道我們很多的項(xiàng)目都是分離的;

而且signalr涉及到連接數(shù)和內(nèi)存資源的占用問(wèn)題,如果都集成在一個(gè)項(xiàng)目里面當(dāng)訪問(wèn)量多大的時(shí)候容易造成網(wǎng)站訪問(wèn)緩慢,具體原因就不多說(shuō)了

所以我這里做了一個(gè)在.net core webapi里面集成signalr,我們就可以通過(guò)調(diào)用webapi來(lái)實(shí)現(xiàn)服務(wù)器向客戶(hù)端推送消息

第一步引用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();
  }

然后我們添加一個(gè)hubs

public class SignalrHubs:Hub
 {
  /// <summary>
  /// 創(chuàng)建signalr鏈接
  /// </summary>
  /// <param name="parentId">pid(作為用戶(hù)組)</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", "用戶(hù)組數(shù)據(jù)更新完成,新增id為:" + Context.ConnectionId + " pid:" + parentId + " sid:" + shopId + "");
  }

  public override Task OnDisconnectedAsync(Exception exception)
  {
   //掉線移除用戶(hù)
   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:我這里是根據(jù)本人業(yè)務(wù)需要來(lái)做的,大家可以修改成其他的(用戶(hù)量大的時(shí)候內(nèi)存占用肯定高,這里只做一個(gè)簡(jiǎn)單的例子)

以上基本的環(huán)境搭建就已經(jīng)完成了

接下來(lái)控制器里面的代碼

[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>
  /// 單個(gè)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>
  /// 多參數(shù)接收方式
  /// </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();
  }
 }

服務(wù)器端的代碼到這里全部完成,接下來(lái)咱們看客戶(hù)端的代碼

我的客戶(hù)端代碼是在另外一個(gè)項(xiàng)目里面,和服務(wù)器端是分離的

<input type="text" id="ParentId" placeholder="ParentId" />
<br />
<input type="text" id="ShopId" placeholder="ShopId" />
<br />
<button id="fuckyou">用戶(hù)上線</button>
<br />
<br />
<br />

<ul id="message" ></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;\">單個(gè)用戶(hù)組推送:" + data + "</li>");
   });
   hubConnection.on('AnyOne', data => {
    $("#message").append("<li style=\"color:blue;\">單個(gè)ID推送:" + data + "</li>");
   });
   hubConnection.on('MoreParamsRequest', (message, date) => {
    $("#message").append("<li style=\"color:green;\">多參數(shù)接收:" + message + " : " + data + "</li>");
   });
   hubConnection.start();

  });
 </script>
}

頁(yè)面上引用連個(gè)js

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

到這里基本就已經(jīng)完成了,下面看一下運(yùn)行效果

第一次寫(xiě)博客,有點(diǎn)緊張,代碼寫(xiě)得比較倉(cāng)促,很多細(xì)節(jié)都沒(méi)有優(yōu)化,有很多不足之處,望各位多多指正

以上這篇asp.net core 2.0 webapi集成signalr(實(shí)例講解)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • .NET連接池的問(wèn)題詳解

    .NET連接池的問(wèn)題詳解

    這篇文章主要介紹了.NET連接池的問(wèn)題詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • Win2008 server + IIS7 設(shè)置身份模擬(ASP.NET impersonation)

    Win2008 server + IIS7 設(shè)置身份模擬(ASP.NET impersonation)

    IIS7 與 IIS 6 相比有了很大的改動(dòng),原來(lái)在 IIS 6 下可以的設(shè)置到了 IIS 7 下有的會(huì)發(fā)生變化。身份模擬的配置上,IIS7 和 IIS6有很大不同,網(wǎng)上IIS6的身份模擬的文章比較多,但介紹IIS7的比較少,我把的一些折騰的經(jīng)驗(yàn)在這篇博客中寫(xiě)下來(lái),以供參考
    2011-10-10
  • ASP.NET中Global和URLReWrite用法

    ASP.NET中Global和URLReWrite用法

    這篇文章主要介紹了ASP.NET中Global和URLReWrite用法,較為深入淺出的分析了Global.asax的功能及配置技巧,并實(shí)例分析了URLReWrite實(shí)現(xiàn)偽靜態(tài)的方法,需要的朋友可以參考下
    2015-06-06
  • C#元組類(lèi)型ValueTuple用法詳解

    C#元組類(lèi)型ValueTuple用法詳解

    本文詳細(xì)講解了C#元組類(lèi)型ValueTuple的用法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-02-02
  • MVC5下拉框綁定的方法(單選)

    MVC5下拉框綁定的方法(單選)

    這篇文章主要為大家詳細(xì)介紹了MVC5下拉框綁定,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • asp.net中用DataReader高效率分頁(yè)

    asp.net中用DataReader高效率分頁(yè)

    自從用Sql2005版本以后一直用ROW_NUMBER()分頁(yè),最近一個(gè)項(xiàng)目維護(hù)sqlserver是2000,沒(méi)辦法重寫(xiě)了分頁(yè)。寫(xiě)完測(cè)試分析比ROW_NUMBER()明顯快啊
    2011-09-09
  • asp.net生成字母和數(shù)字混合圖形驗(yàn)證碼

    asp.net生成字母和數(shù)字混合圖形驗(yàn)證碼

    這篇文章主要為大家詳細(xì)介紹了asp.net生成字母和數(shù)字混合圖形驗(yàn)證碼的實(shí)現(xiàn)方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-02-02
  • ASP.NET Core設(shè)置URLs的五種方法

    ASP.NET Core設(shè)置URLs的五種方法

    這篇文章主要介紹了ASP.NET Core設(shè)置URLs的五種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • asp.net FCKeditor自定義非空驗(yàn)證

    asp.net FCKeditor自定義非空驗(yàn)證

    有時(shí)在使用FCK的,需要對(duì)它做非空的驗(yàn)證。以前一直是使用RequiredFieldValidator控件來(lái)完成的。但是會(huì)有一個(gè)小小的bug,在提交的時(shí)候第一次不能通過(guò)驗(yàn)證。
    2009-12-12
  • .Net Core內(nèi)存回收模式及性能測(cè)試對(duì)比分析

    .Net Core內(nèi)存回收模式及性能測(cè)試對(duì)比分析

    下面小編就為大家分享一篇.Net Core內(nèi)存回收模式及性能測(cè)試對(duì)比分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12

最新評(píng)論

云南省| 合山市| 长治市| 开化县| 葫芦岛市| 棋牌| 延安市| 安宁市| 南宫市| 荥经县| 句容市| 久治县| 澄江县| 读书| 海阳市| 深水埗区| 台中县| 新绛县| 德阳市| 夏河县| 顺义区| 从江县| 调兵山市| 利津县| 清新县| 吉隆县| 武威市| 昌黎县| 常熟市| 长岭县| 合肥市| 石家庄市| 亚东县| 南安市| 贡嘎县| 韩城市| 福建省| 黔南| 延长县| 白山市| 辉县市|