요구사항
- 스탠드 언론으로 실행되는 Rest 웹서비스 , MVC는 기본으로 딸려오나 필수요구사항은 아님
- OS족송적이지 않아야하며 AKKA.net 역시 사용가능해야한다 ( .net core )
- 브라우져 실시간 처리를 위해 웹소켓연동및 Rest연동 필수 (with Actor)
- 빌드및 배포자동화가 실행까지 되어야한다 ( 밤부및 밤부 디플로이 이용 or 도커 )
준비하기
Step0-프로젝트 생성
namespace MicroAKKAWebService { class Program { static void Main(string[] args) { } } }
마이크로 웹서비스를 만들기 위해, 빈 어플리케이션을 만드는것입니다. 이것은 MS.VS를 사용하여
완성된 기본 템플릿 asp.net을 만드는것이 아님으로, 웹서비스에 필요한 요소를 하나하나 필요한것만
구성을 할것이며 그것은 경량화되어 배포가느아고 작동될것입니다.
Step1- Owin Host with Nancy 인스톨
Install-Package Microsoft.Owin.Hosting
Install-Package Microsoft.Owin.Host.HttpListener
Install-Package Nancy.Owin
Nuget 설치 관리자로부터, 위 패키지를 설치를 합니다.
Step2- 웹서비스 시작 클래스 작성
using Owin; namespace MicroAKKAWebService { public class Startup { public void Configuration(IAppBuilder app) { app.UseNancy(); } } }
using Microsoft.Owin.Hosting; namespace MicroAKKAWebService { class Program { static void Main(string[] args) { var url = "http://+:8080"; using (WebApp.Start<Startup>(url)) { Console.WriteLine("Running on {0}", url); Console.WriteLine("Press enter to exit"); Console.ReadLine(); } } } }
콘솔서비스를 실행한후, 웹브라우져에 localhost:8080 접근시 위와같은 화면을 볼수 있으면 성공입니다.
여기까지가, 웹서비스 기본 Empty 프로젝트를 만들었으며 이제 살을 붙여
라우터정의, Get/POST처리등이 가능하도록 기능추가를 해보겠습니다.
만약 실행이 안되면, +(모든도메인)에 대해 웹서비스를 바인딩할 권한이 없는것이기때문에
커멘드 콘솔에서 다음과 같은명령어로 허용을 해줍니다.
netsh http add urlacl url=http://+:8080/ user=DOMAIN\username
혹은 VisualStudio를 Admin권한으로 실행하면 됩니다.
Step3- Root(Home) 라우터 설정
using System; using System.IO; using System.Threading; using System.Collections.Generic; using System.Linq; using Nancy; using Nancy.Owin; namespace MicroAKKAWebService { public class HomeModule : NancyModule { public HomeModule() { Get["/"] = x => { var env = this.Context.GetOwinEnvironment(); var requestBody = (Stream)env["owin.RequestBody"]; var requestHeaders = (IDictionary<string, string[]>)env["owin.RequestHeaders"]; var requestMethod = (string)env["owin.RequestMethod"]; var requestPath = (string)env["owin.RequestPath"]; var requestPathBase = (string)env["owin.RequestPathBase"]; var requestProtocol = (string)env["owin.RequestProtocol"]; var requestQueryString = (string)env["owin.RequestQueryString"]; var requestScheme = (string)env["owin.RequestScheme"]; var responseBody = (Stream)env["owin.ResponseBody"]; var responseHeaders = (IDictionary<string, string[]>)env["owin.ResponseHeaders"]; var owinVersion = (string)env["owin.Version"]; var cancellationToken = (CancellationToken)env["owin.CallCancelled"]; var uri = (string)env["owin.RequestScheme"] + "://" + requestHeaders["Host"].First() + (string)env["owin.RequestPathBase"] + (string)env["owin.RequestPath"]; if (env["owin.RequestQueryString"] != "") uri += "?" + (string)env["owin.RequestQueryString"]; return string.Format("Hello WebService {0} {1}", requestMethod, uri); }; } } }
마이크로 rest서비스를 위해서 이것만 있으면 충분합니다.
더 고급적인 웹서비스의
Link: https://github.com/NancyFx/Nancy/wiki/Documentation