기본 콘텐츠로 건너뛰기

라벨이 웹 서비스인 게시물 표시

명령행으로 웹서비스 배포하기

웹서비스를 단위 테스트하기 위하여 명령행으로 웹서비스를 배포하도록 작성했습니다. 일반적인 단위 테스트트는 프로젝트는 참조하여 테스트를 진행하면 되지만 웹서비스의 경우에는 먼저 서비스가 웹서버에 배포되어야 하는데 수작업으로 웹서버에 배포를 해야한다면 단위 테스트를 자동화할수 없습니다. 그래서 어플리케이션을 빌드할때 웹서비스를 컴파일하고 -> 명령행으로 자동으로 웹서버에 배포한 뒤 -> 단위 테스를 진행하도록 하였습니다. MSBuild.exe를 이용하여 웹서비스를 컴파일 한뒤 배포할 수 있습니다. WebApi 프로젝트를 Release로 컴파일 한뒤 CustomProfile을 이용하여 웹서버에 배포합니다. 1 %MSBUILD% WebApi.csproj  / t:WebPublish  / p:DeployBuild = true ;Configuration = Release  / p:PublishProfile = CustomProfile  / p:VisualStudioVersion = 15. 0   cs 컴파일에 앞서 배포할 Profile을 하나 만들어 줍니다.(참조 : https://docs.microsoft.com/ko-kr/aspnet/web-forms/overview/deployment/visual-studio-web-deployment/deploying-to-iis" ) 프로젝트 파일을 컴파일하는 경우에는 VS 버전을 명시해야 한다고 합니다. (/p:VisualStudioVersion=15.0 => VS 2017) 이렇게 웹배포가 끝난뒤에 xUnit을 이용하여 Web Api에 대한 단위 테스트를 진행할 수 있습니다.

gSOAP으로 웹 서비스 이용하기

1. gsoap 라이브러리 다운받기 gsoap 홈페이지에가서 최신 버전을 다운받습니다. 2. WSDL에서 헤더 파일(*.h) 생성 3. wsdl2h -o MyFirstWebService.h http://www.solutionware.co.kr/MyFirstWebService/MyFirstWebService.asmx?wsdl -o : 헤더 파일 이름을 지정하는 옵션 -c : 순수 C을 사용하는 헤드 파일을 만들겠다는 옵션 4. 헤더 파일을 가지고 스텁코드 생성하기 soapcpp2 -i -C -I<gSOAP의 import 폴더 위치> MyFirstWebService.h -i : C++ 베이스의 스텁코드를 생성하겠다는 옵션 -C : only generate client code -X : does not generate the xml -T typemap.dat : convert the data type dat rule typemap -I(대문자 i) : directly use C++ wrapper class 5. VS2010에서 Win32 콘솔 프로젝트를 생성 6. "추가 포함 디렉터리"에 gsoap이 있는 위치를 추가합니다. 7. 위에서 생성한 파일들을 프로젝트 폴더에 복사 *.nsmap *.cpp , *.h 8. 프로젝트에 복사한 파일들을 추가 이때 gsoap 폴더에 있는 stdsoap2.cpp 파일도 프로젝트에 추가합니다. 9. 클라이언트 코드를 구현 #include "stdafx.h" #include "soapMyFirstWebServiceSoapProxy.h" #include "MyFirstWebServiceSoap.nsmap" int _tmain(int argc, _TCHAR* argv[]) { MyFirstWebServiceSoapProxy soapProxy; _ns1__HelloWo...

인터페이스의 단순화

이번 프로젝트를 하면서 서비스의 인터페이스를 통일화 시켜 2개의 Method만을 외부로 노출시켰습니다. 입,출력 인자는 둘다 DataSet을 이용하였습니다. 실제 구현부는 별도의 Dll로 만들었고 해당 Dll을 로딩하여 클래스 인스턴스를 생성하여 특정  Method을 호출하는 방식으로 서비스를 구성하였습니다. 이 방식의 장점은 서비스 Method가 늘어날 필요가 없다는 것입니다. 단점으로는 넘겨줄 인자의 정보를 파악하기가 힘들다는 것입니다. 구현 정보를 외부로 덜 노출한다는 점과 인터페이스가 단순하다는 점에서 이 구현 방식을 사용하였습니다. [인터페이스] [OperationContract] DataSet GetCommandParam(string sAssemblyName, string sClassName); [OperationContract] DataSet ExecuteCommand(string sAssemblyName, string sClassName, DataSet oParam); [구현부] Assembly oAssembly = AssemblyHolder.GetAssembly(sAssemblyName); if (null != oAssembly) { Type oClassType = oAssembly.GetType(sAssemblyName + "." + sClassName); MethodInfo oMethodInfo = oClassType.GetMethod("GetParam", BindingFlags.Public | BindingFlags.Instance); if (null != oMethodInfo) { object oClassIntance = Activator.CreateInstance(oClassType, null); object[] oParamArray = new object[] { sPrjCode, sSiteID }; re...