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(인 스 턴 스 설명)은 바로 작은 편집 이 여러분 에 게 공유 하 는 모든 내용 입 니 다.참고 하 실 수 있 고 많은 응원 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
작업 중 문제 해결 - (win 2003 asp. net) Session 과 페이지 전송 방법 으로 해결 방안 을 정상적으로 사용 할 수 없습니다.또한 F 는 처음에 우리 의 BP & IT 프로젝트 팀 이 Forms 폼 검증 을 사용 했다 고 판단 할 수 있 습 니 다. 페이지 를 뛰 어 넘 는 것 은http://hr.bingjun.cc/MyTask/MyTas...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.