WCF - RESTful API

RESTful 서비스

  • URI나 표준 동사(POST, GET, PUT, DELETE) 등 HTTP 사양을 강하게 의식한 리소스 베이스의 접근을 제공.
  • 최신의 프레임워크는 대 부분 RESTful 서비스를 만들 수 있는 기능 지원.
  • WCF의 REST 서비스에서는 POX (Plan XML 형식), AJAX 애플리케이션 등에서 사용 되는 JSON (JavaScript Object Notation), RSS/Atom 등의 피드 등 다양한 메시지 포맷의 서비스를 구축하는 것이 가능.

샘플 코드

  • Post 방식, 요청과 답변 Json
public struct REQ_DEV_ECHO
{
    public int WaitSec;
    public string ReqData;
}

public struct RES_DEV_ECHO
{
    public bool Result;
    public string ResData;
}
namespace WCFServerLib
{
    [ServiceContract]
    public interface IServerService
    {
        [OperationContract]
        RES_DEV_ECHO TestEcho(REQ_DEV_ECHO requestPacket);
    }
}
namespace WCFServerLib
{
	// 참고: "리팩터링" 메뉴에서 "이름 바꾸기" 명령을 사용하여 코드 및 config 파일에서 클래스 이름 "Service1"을 변경할 수 있습니다.
	[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
	public class ServerService : IServerService
	{
		ServerService()
		{
		}

    // http://localhost:20401/Service/TestEcho
    [WebInvoke(Method = "POST",
                RequestFormat = WebMessageFormat.Json,
                ResponseFormat = WebMessageFormat.Json,
                UriTemplate = "TestEcho")]
    public RES_DEV_ECHO TestEcho(REQ_DEV_ECHO requestPacket)
    {
        var result = new RES_DEV_ECHO() { Result = true, ResData = "Hello !!!" };
        return result;
    }
}
  • Post 방식, 답변은 OK
[WebInvoke(Method = "POST",
					RequestFormat = WebMessageFormat.Json,
					UriTemplate = "NotifyLockCheckUnLock")]
public void NotifyLockCheckUnLock(NTF_LS_REQUEST_UNLOCK_DATA request)
{
	try
	{
		var preCheck = ClientRequestPrepare.CheckServerStatus();
		if (preCheck != ERROR_CODE.NONE)
		{
			return;
		}

		Request.RequestLock.ProcessUnLock(request);
	}
	catch (Exception ex)
	{
		OPLogger.Exception(LOG_TYPE.REQUEST_EXCEPTION, 0, ex.Message, ex.StackTrace);
	}
}
  • Post 방식, 요청과 답변은 string
[WebInvoke(Method = "POST",
                    UriTemplate = "TestRequestString")]
public string TestRequestString(string requestPacket)
{
    var result = requestPacket;
    return result;
}

  • Post 방식, 요청 application/x-www-form-urlencoded, 답변은 json
// http://localhost:20401/Service/TestRequestStream
[WebInvoke(Method = "POST",
            ResponseFormat = WebMessageFormat.Json,
            UriTemplate = "TestRequestStream")]
public RES_DEV_ECHO TestRequestStream(System.IO.Stream data)
{
    try
    {
        var reader = new System.IO.StreamReader(data);
        var result = new RES_DEV_ECHO() { Result = true, ResData = reader.ReadToEnd() };
        return result;
    }
    catch (Exception ex)
    {
        FileLogger.Exception(ex.Message);
        return new RES_DEV_ECHO() { Result = false, ResData = "" };
    }
}

  • Get 방식, 답변은 OK
[WebInvoke(Method = "GET",
					UriTemplate = "RequestHeathCheck")]
public void RequestHeathCheck()
{
	if (ServerLogic.ServerInit.EnableRequestHeathCheck)
	{
		FileLogger.Info("RequestHeathCheck");
	}
	else
	{
		OutgoingWebResponseContext response = WebOperationContext.Current.OutgoingResponse;
		response.StatusCode = System.Net.HttpStatusCode.Forbidden;
		response.StatusDescription = "Server Spot Check";
	}
}

참고


이 글은 2019-01-10에 작성되었습니다.