안녕하세요.
ASP.NET Core Web API 서비스를
UseKestrel 통해 셀프 호스팅으로 사용하 고 있습니다. (IIS 사용 X)
Web API에 SignalR 서비스를 추가하기 위해서 다음과 같이 서비스를 등록하고
Hub구성을 하였는데요..
[Startup.cs]
services.AddSignalR(option =>
{
option.HandshakeTimeout = new TimeSpan(0, 1, 0);
option.KeepAliveInterval = new TimeSpan(0, 1, 0);
option.EnableDetailedErrors = true;
});
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
endpoints.MapHub<PlaceHub>("/placeHub");
);
위와 같이 설정 후 웹소켓 서버가 Open된 것을 확인 할 수 있습니다.
웹소켓 클라이언트는 일반 C# Console 환경에서 사용하기 위해
signalR 클라이언트가 아닌 System.Net.WebSockets 을 이용해서 직접
ASP.NET Core Web API 웹소켓 서버에 접속 시켰습니다.
참고 : aspnetcore/Program.cs at main · dotnet/aspnetcore (github.com)
웹서버에 접속 까지는 가능하나 Receiving에서 ReceiveAsync()호출을 하면
위에 서버에서 설정한 핸드쉐이크 타임아웃 시간 이후에
서버측으로 부터 handshake was canceled 오류가 메세지가 전달 됩니다.
- 콘솔 클라이언트가 아닌 자바스크립트로는 정상 통신이 됩니다.,
- wss 사용이 아닌 ws로 사용하고 있습니다.
혹시 해당 이슈에 대해 원인과 해결방법을 알고 계신분 계시면 답변 부탁드립니다.
혹시나 하여 Web API 서버측 Hub 코드도 올립니다.
public class PlaceHub : Hub
{
public override Task OnConnectedAsync()
{
return Clients.All.SendAsync("ServerMsg", "Connected");
}
public override Task OnDisconnectedAsync(Exception exception)
{
return Clients.All.SendAsync("ServerMsg", "Disconnecte");
}
public Task SendToOthers(string senderID, string tickerCode, string ticker, double price, double units, double weight, string type, string kind)
{
return Clients.Others.SendAsync("Place", senderID, tickerCode, ticker, price, units, weight, type, kind);
}
}