asp.net core 2.0 webapi 통합 시그 널(인 스 턴 스 설명)

블 로그 원 에서 도 여러 해 동안 아무것도 공유 한 적 이 없고 블 로 그 를 쓴 적 이 없 지만 자신 도 블 로그 원 의 지식 을 받 아들 여 성장 했다.
요 며칠 동안 이렇게 사심 이 없어 서 는 안 된다 고 생각 했 어 요.요즘.NET CORE 가 유행 하 는 것 같 아 요.할 일 없 이 asp.net core signal 을 만 들 었 어 요.
블 로그 가든 에 도.net core 2.0 아래 signal r 를 통합 한 사람 이 있 지만 같은 프로젝트 에 통합 되 어 있 습 니 다.하지만 우리 의 많은 프로젝트 가 분 리 된 것 을 잘 알 고 있 습 니 다.
또한 signal r 는 연결 수 와 메모리 자원 의 점용 문제 와 관련 되 어 있 습 니 다.만약 에 한 프로젝트 에 통합 되면 방 문 량 이 많 을 때 사이트 방문 이 느 리 고 구체 적 인 원인 은 더 이상 말 하지 않 습 니 다.
그래서 저 는.net core webapi 에 signal r 를 통합 하면 웹 api 를 호출 하여 서버 가 클 라 이언 트 에 게 메 시 지 를 전송 할 수 있 습 니 다.
첫 번 째 인용 nuget:Mrcrosoft.AspNetCore.SignalR
두 번 째 단계 설정 코드 추가:
먼저 Configure Services 에 다음 코드 를 추가 합 니 다.

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" ></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>
}
페이지 참조


여기까지 거의 완성 되 었 습 니 다.다음은 운행 효 과 를 보 겠 습 니 다.

처음 블 로 그 를 쓰 는데 조금 긴장 되 고 코드 가 급 하 게 쓰 여 져 서 디 테 일이 최적화 되 지 않 았 습 니 다.부족 한 점 이 많 습 니 다.여러분 께 서 많이 지적 해 주시 기 바 랍 니 다.
이상 의 asp.net core 2.0 webapi 통합 signal(인 스 턴 스 설명)은 바로 작은 편집 이 여러분 에 게 공유 하 는 모든 내용 입 니 다.참고 하 실 수 있 고 많은 응원 바 랍 니 다.

좋은 웹페이지 즐겨찾기