C++로 만든 dll을 최신 기술인 .NET 기반의 WCF, Silverlight에서 사용하는 것이 흥미로운 부분이었다. 그리고 IIS를 쓰긴하는데 좀 다르게 그냥 F5누르면 실행되는 간이 식이고 80포트를 쓰지 않아 서버를 돌리는 집 컴퓨터에서도 쓸수 있었다. 좋았다.
WCF는 .NET에서 제공하는 통신 서비스다.
웹도 아니고 TCP도 아닌 어떤것데 국한되지 않은 말 그대로 Communication을 효과적으로 관리해주는 프레임워크 다. 책의 앞부분만 보고 뒷부분들은 필요한 부분만 보고 있다;
시작한지 3일째라 ㅋ 얕다.
언제나 그렇듯 이름에 모든게 담겨 있는데 괜한 IIS니 ASP니 하는 안개가 나를 헷갈리게 했다.
Silverlight는 거의 별로 할게 없어서 나중에 연동 부분만 만졌고 사실상 WCF가 주류를 이룬다.
WCF는 서버를 켜두고 http, tcp, 등등 설정하는데로 맘데로다.
그냥 하드코딩으로도 거의 TCP서버 클라이언트 C++로 만들 듯이 만들어도 된다.
하지만 configuration 이라는 xml로 설정해서 하드코딩은 없앴다. 이 web.config 와 같은 식으로 생성되는 파일은 xml형식으로 binding 방식, host, endpoint, behavior(이건 모른다) 등을 지정하여 말그대로 어떻게 보낼지 방식을 하드코딩이 아니라 밖에 빼둔 것이다.
WCF는 서버와 클라이언트의 정보를 endpoint라는 것으로 주고받는데 말이 endPoint이지 사실 그냥 코딩하는 입장에선 패킷이라고 생각해도 될 것 같다.
어떤 방식을 보낼지를 바인딩 이라는 이름을 명명해서 header를 xml에 붙여서 보내는 것 같다. SOAP나 json 등의 방식으로 보낸다는데 그냥 xml같이 다 트리형식의 무엇인가에 담아서 보내는거라; 그냥 xml 비슷한 것이라고 생각해도 괜찮다. 뭐든 정보를 어떤 그릇에 담아 보내는 것이니;
재미있는 것은 wcf 클라이언트 쪽에서는 거의 함수를 그대로 부르듯이 실행해도된다는 것이다. factory를 이용해서 channel을 열고 그중에 채널에서 하나를 factory가 주고 그걸 가지고 하는 것만 빼면 return값도 그냥 받을 수 있으니 이건 거의 로컬의 메소드나 마찬가지로 부르는 것이다. 뒷부분은 자세히 보지 않아 proxy 메소드를 자동 작성해주는 부분은 보지 않았지만 아무튼 wcf클라이언트는 그냥 proxy 메소드를 작성해서 쓰면된다.
Silverlight에 WCF를 합치는 것은 한 층 더 쉬워 진다.; 그냥 Silverlight 서버에 addItem해서 silverlight-enable WCF를 추가하면 svc라는 scv같은 파일이 생기고 그냥 이게 cs다;;
원하는 방식으로 서버의 바인딩을 web.config를 이용해서 바꾸면 Client에 service reference를 추가하면 알아서 clientconfig도 바뀐다.
프로그래머는 할 일이 없다;
그리고 나서 reference를 불러오면 된다. 그리고 결과 값을 async하게 리스너로 받아오면 땡~! 그러면 C++의 포인터를 사용하는 구시대적 함수도 최신의 WCF 와 Silverlight의 은총을 받을 수 있다.
단, 문제는 많았다;
그거 때문에 3일이나 걸렸다 ㅠㅠ
나중에 정리할 것이므로 여기는 그냥 평서문 으로 쓰겠다.
OpenCVSharp의 dll은 어디다가 두어야지 WCF Server의 서비스가 이용할수 있는지 알려주는 곳을 찾지 못했다. 그건 그냥 쉽다; Silverlight의 호스트 설정에서 라이브러리 폴더를 지정해주고 reference에 원래 하던데로 openCVSharp.dll을 추가만 해주면된다.
이거 오래 걸렸다 슬펐다.
WCF에서는 프로그램으로 서버를 띄우면 그냥 되다가 IIS로 호스팅하는 순간 이에러가 나서 이유를 처음에는 알지 못했다;;;
C++의 dll은 그냥 실행되는 곳에 xxx.web/bin 에 그 dll을 넣어주고 원래하던데로 하면된다. 그리고 그 C#파일을 svc파일에서 유징하면 된다. 음; 생각해보면 바로 svc에서 dll export를 사용해도 되겠지만 안해봤다; 나중에 심심하면 해봐야지 zz
경로 문제는 위 두 개 였고..
config에서 생각지 못한 에러들은 오타도 그렇고 경로도 그렇고; 아무튼 처음하면 오타를 확인 해야한다.
당연하지만 client와 server의 바인딩 방법은 똑 같아야 한다. 헷갈리거나 졸리면 낭패.
그리고 서버의 메소드 계약부분을 바꾸면 클라이언트에서 servicereference를 업데이트 해야한다. 그럼 다운을받는 것처럼 바가 올라가면서 업데이트 한다;
역시.. 프로그래머는 할 일이 없다; 구경한다.
visual studio로 웹을 개발한 적이 없으니; 그냥 뭐 할때마다 rebuild하고 서버가 안꺼저 있으면 계속끄면서 했다. 뚝딱뚝딱;
가장 당황했던 에러이자 허무 하게 해결 된 것은
서버 사이드의 메소드 호출을 연속적으로 막하면 에러가 나는 것이었다.
async의 저주라고 생각하여 wcf부터 파려고 하다가 혹시나해서 F5에 지그시 ctrl을 덧붙여 배포를 했더니; 에러 안난다;
나처럼 학생수준에서 뭘 돌려보고 간단한 어플을 구현할 생각이면 그냥 기본적인 async를 쓰면 될것같다.
RIAin Silverlight3 라는 책에서 보면서 했지만; 책이 참;; 공부할책은 아닌듯하다.
사고나서 본 페이지가 17;; 그나마 소스도 전체가 아니고 부분부분이라 좀 슬펐다 ;;
설명은 없고 소스는 부실하게 보여줬다. 하지만 원했던 Silverlight와 WCF 연동은 확실히 이책의 공이 컸다. 또한 DB도 내가 하려던 무식한 방법이 아닌 듯해서 다행이다. 역시 깊이 있는 내용은 아니고 아동용 따라하기 지만; 지금 Linq부터 파고 있을 때가 아니니; 비도 오는데;
WCF바이블은 굿이다. 대화하는 식의 저자 말에 처음에 당황하지만; 익숙해지면 볼 것 많다.
아무튼 나는 요새 컴퓨터는 그냥; 말을 잘들으면 토닥토닥 안들으면 잔다; 내가; 그러면 해결된다;
만약 마지막 부분의 에러가 지속되면 아마9장에서 단방향/비동기 호출 및 콜백 과 11장 신뢰할 수 있는 메시징을 봐야 할 것같다.
결국 클라이언트는 Silverlight UI가 서버는 WCF가 돌아갈 것이다. 뭔가 웃긴그림이지만; 그러라고 이렇게 만든건지 서버가 IIS고 WCF 서비스를 선언하고 계약해서 사용하고 Silverlight는 제것 마냥 쓰는 ; 하지만 속도는 GG 굿 게임이다;
다음에는 정리해서 문서화 할 수 있도록 해야지^^