블로그 이미지
kyeongkyun

calendar

      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    

Notice

2010/01/31 02:34 세미나

항상 느끼지만 세미나가 끝난 후에는 항상 아쉬움이 남습니다. 조금만 더 준비를 했더라면.. 조금만 더 침착 했더라면.. 해서, 이번 부터는 부족한 부분을 채우기 위해 아티클로 좀 더 정리를 해 보려고 합니다. 마음 같아서는 빨리 빨리 포스팅을 하고 싶긴 하지만.. 어쨌든 틈틈이 REST관련 아티클 들을 정리 하여 포스팅 하도록 하겠습니다.

오늘 세미나를 찾아주신 모든 분들과 Taeyo.NET의 모든 운영진들께 감사의 말씀을 전하고 싶습니다.

다음은 금일 세미나 데모와 PT자료입니다.

REST 아티클 목록
.NET Framework 4.0의 REST 지원- HTTP Cahce 지원
.NET Framework 4.0의 REST 지원 - Automatic Help Page Support

 

저작자 표시
크리에이티브 커먼즈 라이선스
Creative Commons License
posted by kyeongkyun(kobukii) kyeongkyun
2010/01/08 18:07 WCF

.NET Framework 4.0 REST 지원

 

2. Http 캐시 사용하기

REST 서비스를 사용하면서 가장 큰 장점이라고 할 수 있는 것이 바로 HTTP 캐싱을 사용할 수 있다는 것이다. .NET Framework 4에서는 AspNetCacheProfile 어트리뷰트를 사용하여 아주 간단하게 REST 서비스를 캐시할 수 있습니다. AspNetCacheProfile 어트리뷰트는 ASP.NET output 캐시와 함께 동작하게 됩니다.

리스트 1. OutputCache 설정

<system.web>

<compilation debug="true" targetFramework="4.0" />

<caching>

<outputCacheSettings>

<outputCacheProfiles>

<add name="defaultCache" duration="60" varyByParam="postid" />

</outputCacheProfiles>

</outputCacheSettings>

</caching>

</system.web>

 

이전의 output 캐시 설정 방법 대로 postid라는 매개변수의 값에 따라 그리고 60초를 유지하도록 캐시를 설정합니다.

리스트 2. 어트리뷰트 추가

[AspNetCacheProfile("defaultCache")]

[OperationContract]

[WebGet(UriTemplate = "/GetPost/{postId}", ResponseFormat = WebMessageFormat.Json)]

Post GetPost(string postId);



 

캐시를 지정할 메서드에 AspNetCacheProfile 어트리뷰트를 추가하고 앞에서 만든 outputCacheProfile의 이름을 입력합니다. 이렇게 하면 GetPost를 호출 할 경우 postid에 대해 캐시가 만들어지며 60초 동안 그 값이 유지됩니다.

WCF REST 서비스에서 output Cache 사용하기 위해서는 ASP.NET 호환성을 true 설정해야 한다. 호환성을 설정 하는 방법은 serviceHostingEnviroment 엘리먼트를 추가하고 호환성을 설정하는 aspNetCompatibilityEnabled true 설정 해야 합니.

 

<system.serviceModel>

<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>

<system.serviceModel>

이렇게 다음 모든 것이 정상적으로 돌아가면 좋겠지만 다음과 같은 오류를 뱉어 낸다.

 

 

오류는 서비스가 ASP.NET 호환성을 지원하지 않기 때문에 활성화 없으니 호환성을 켜라~ 이런 이야기를 하고 있는데 그대로 WCF 서비스가 ASP.NET 호환 코드로 실행 되지 않기 때문에 발생하는 오류입니다. 다음 코드와 같이 서비스 클래스에 어트리뷰트를 추가하고 RequirementsMode AspNetCompatibilityRequirementsMode.Allowed 설정하면 ASP.NET호환 코드로 동작하게 됩니다. 기본 값은 NotAllowed입니다.

 

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

public class PostService : IPostService

{

.

.

마지막으로 Fiddler를 통해 테스트를 해보면 헤더의 캐시 부분에 우리가 설정 한 대로 1분간 캐시 되는 것을 확인 할 수 있습니다.

 

 

다음 포스트에서는 조건부 요청, 예외처리, 다양한 메시지 포멧에 대해 다뤄 보도록 하겠습니다.

감사합니다.^^

크리에이티브 커먼즈 라이선스
Creative Commons License
posted by kyeongkyun(kobukii) kyeongkyun
2010/01/08 14:27 WCF

.NET Framework 4.0 REST 지원

 

.NET Framework 4에서는 WCF를 통해 RESTful 서비스를 개발 할 때 도움을 줄 수 있는 몇 가지 기능이 추가 되었습니다.  첫 번째로 개발한 RESTful 서비스에 대해 서비스를 사용하는 사람이 제공되는 서비스를 보다 쉽게 이해할 수 있도록 하기 위해 도움말 페이지를 자동으로 만들어 줍니다. 두 번째는 동일한 요청에 대해 보다 좋은 성능을 낼 수 있도록 선언적으로 구성할 수 있는 HTTP 캐싱을 지원합니다. 마지막으로 몇 가지 중요한 기능이 추가 되었습니다. 조건에 다라 GET/PUT 요청을 수행할 수 있는 기능이 추가 되었고 WebFaultException을 제공하여 예전에는 지원되지 않았던 REST 클라언트에게 오류 메시지를 반환 할 수 있게 되었습니다. 마지막으로 REST 서비스에 다양한 메시지 포맷으로 컨텐츠를 반환 할 수 있게 되었습니다. 예전에는 JSON과 XML만을 제공 하였으나 ATOM, Text, Binary등을 지원하게 되었습니다.  

지금부터 하나씩 살펴 보도록 하겠습니다.

도움말 페이지 사용하기

WCF 웹프로그래밍 모델로 구현된 RESTful 서비스는 HTTP GET이나 HTTP POST와 같은 HTTP 기본동사를 사용하기 때문에 별도의 WSDL을 제공하지 않습니다. 그렇기 때문에 일반적인 ASP.NET 웹 서비스나 WCF 서비스에서처럼 "웹 참조" 혹은 "서비스 참조"를 사용할 수 없습니다. 만약 서비스에 대한 정확한 스팩을 별도로 제공하지 않는다면 RESTful 서비스를 사용하는 사용자 입장에서는 어떠한 정보도 알 방법이 없다는 단점이 있습니다. 이러한 점을 해결하기 위해 .NET Framework4 에서는 간단한 설정을 통해 도움말 페이지를 제공할 수 있는 기능이 추가 되었습니다.

이미 개발 해 놓은 웹프로그래밍 모델로 구현된 서비스에 도움말 페이지를 사용할 수 있도록 하기 위해서는 끝점의 동작에 대한 정보를 설정하는 endPointBehavior를 추가합니다. 그런 다음 새로운 behavior를 추가하고 자식 엘리먼트로 webHttp 엘리먼트를 추가한 후 helpEnabled 어트리뷰트를 true로 설정하면 도움말 페이지를 볼 수 있습니다.

 

리스트 1. Help Page 표시를 위한 Configuration 설정 

<system.serviceModel>
  <behaviors>
    <endpointBehaviors>
      <behavior>
        <webHttp helpEnabled="true" />
      </behavior>
    </endpointBehaviors>
  </behaviors>
  <services>
    <service name="Blog.Web.PostService">
      <endpoint
          binding="webHttpBinding"
          address=""
          contract="Blog.Web.IPostService" />
    </service> 
  </services>
</system.serviceModel>

 

설정을 완료 한 후 해당 svc파일을 미리 보기 하면 [그림1]과 같은 초기 화면을 볼 수 있습니다. Help설정을 하기 전에는 이 화면에 끝점을 찾을 수 없다는 메시지만 출력 되었으나 Help설정 후에는 친절하게도 유효한 요청을 생성할 수 있는 서비스 도움말 페이지를 제공한다고 표시됩니다.

페이지의 service help page 라는 링크를 클릭하거나 Url의 가장 뒤에 /help를 입력함으로써 도움말 페이지로 이동 할 수 있습니다.

 


그림 1. 서비스 시작 페이지

 

도움말 페이지는 svc 파일 즉, 현재 서비스에서 노출 하고 있는 서비스의 목록을 보여줍니다. 목록은 UriTemplate를 통해 이름 지어진 Uri, 표준 HTTP 동사, 그리고 간단한 설명이 표시됩니다. 각 HTTP 동사에 링크가 걸려있고 이를 클릭하면 보다 자세한 정보를 제공합니다.

 


그림 2. 도움말 목록 페이지

 

SetPost에 대한 자세한 도움말을 요청 형식(XML 또는 Json)에 따라 Body를 구성할 수 있는 예제가 주어 집니다. 또한 XML은 관련 스키마를 제공해 주기도 합니다.

예를 들어 HTTP Method가 POST이고 Body를 [그림 3] 의 XML또는 Json Body 처럼 구성하면 새로운 포스트를 작성 할 수 있게 되는 것입니다. 그리고 이 메서드는 아무것도 반환하지 않으므로 응답은 Response Body가 비어 있다는 설명과 함께 N/A로 나타나게 됩니다.

 


그림 3. 상세 도움말 페이지

 각 도움말 페이지는 서비스당 즉 .svc당 하나씩 만들어지게 되며 OperationContract특성이 붙어있는 모든 서비스 메서드가 노출 됩니다.

다음 포스트는 HTTP Caching 지원에 대해 살펴 볼까 합니다.  다음 포스트에서 뵐께요~^^

크리에이티브 커먼즈 라이선스
Creative Commons License
posted by kyeongkyun(kobukii) kyeongkyun
prev 1 next