SignalR 정리

SignalR 정리

http://jacking.tistory.com/1139

self 호스팅

  • (영어) http://www.asp.net/signalr/overview/signalr-20/getting-started-with-signalr-20/tutorial-signalr-20-self-host
  • (일어. 클라이언트) http://okazuki.hatenablog.com/entry/20130512/1368371469
  • 위의 도움말과 다르게 Nuget으로 SignalR-selfHost을 설치한 후 따로 Microsoft.OWIN.Cors를 Nuget에서 다시 설치해야 한다.
  • 서버의 경우 SignalR 부분을 클래스 라이브러리에서 사용하는 경우 이 클래스 라이브러리를 사용하는 프로그램에서 class Startup을 재정의 해야한다. Startup 클래스는 프로그램에서만 로딩하는 것 같다(2013.11.05)

rpc 함수 이름 한글 사용

  • 메시지 이름은 당연(?) 영어가 아닌 한글도 가능하다.
    // 서버측 리시브 부분
    public void 테스트_메시지보내기(string message)
    {
     Clients.All.테스트_메시지보내기(string.Format("Re:{0}. {1}", message, DateTime.Now));
    }
    // 클라이언트측 보내기 부분
    public void 테스트_메시지보내기(string msg)
    {
     agentHubProxy.Invoke("테스트_메시지보내기", msg).Wait();
    }
    

WebApp.Start 호출하기

  • using 문에서 Dispose 호출하기
    // 스레드에서 호출하는 함수
    public void NetworkThreadProc()
    {
      using (WebApp.Start(serverAddress))
      {
          while (IsThreadRunning)
          {
              ...
          }
      }
    }
    
  • 명시적으로 Dispose 호출하기
    IDisposable SignalR;
    ....
    SignalR = WebApp.Start(serverAddress);
    ....
    SignalR.Dispose();
    

특정 Hub 인스턴스를 얻기

_hubContext = GlobalHost.ConnectionManager.GetHubContext<MoveShapeHub>();

Hub 인스턴스의 Clients 얻기

GlobalHost.ConnectionManager.GetHubContext<StockTickerHub>().Clients

서버 주소 지정

  • Self-Host에서는 로컬 접속에서는 “http://localhost:9080” 라고 설정하면
    • 클라이언트 접속이 잘 되지만 클라이언트가 리모트로 접속할 때는 접속 거부를 한다.
    • 서버에서 리모트에 있는 클라이언트의 접속을 받아 들이기 위해서는 주소를 다음과 같이 한다. “http://*:9080” 그리고 위와 같이 주소를 지정할 때는 관리자 권한으로 실행해야 한다.

데이터를 보낼 때는 비동기로 보낸다

  • Windows 7에서는 문제 없으나 Invoke 호출 후 Wait()를 호출하면 Windows Server 2012에서는 먹통이 된다.
    HubProxy.Invoke("서버 함수", json).Wait(); // 이렇게 하면 먹통이 된다.
    HubProxy.Invoke("서버 함수", json)         // 이렇게 해야 한다.
    

서버와 다른 주소에서 javascript 클라이언트 접속

  • javascript 클라이언트가 서버와 다른 주소에서 접속할 때는 기본적으로 보안상 금지이다.
  • 이것을 막기위해 CORS 규약이 있다.
  • 서버
    class Startup
    {
      public void Configuration(Owin.IAppBuilder app)
      {
          app.Map("/signalr", map =>
          {
              // Setup the CORS middleware to run before SignalR.
              map.UseCors(CorsOptions.AllowAll);
    
              var hubConfiguration = new Microsoft.AspNet.SignalR.HubConfiguration
              {
              };
    
              map.RunSignalR(hubConfiguration);
          });
    
      }
    }
    
  • 클라이언트
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<title></title>
	<script type="text/javascript" src="Scripts/jquery-2.1.1.js"></script>
	<script type="text/javascript" src="Scripts/jquery.signalR-2.0.3.js"></script>
	<script src="http://100.21.6.21:29090/signalr/hubs"></script>
	<script type="text/javascript">
		$(function () {
			$.connection.hub.url = "http://100.21.6.21:29090/signalr";
			$.connection.hub.start(function() {
				alert('connection started!');
			});
		});
	</script>
</head>
<body>

</body>
</html>
  • 참고
    https://sakapon.wordpress.com/tag/asp-net-signalr/

이 글은 2018-10-07에 작성되었습니다.