블로그 이미지
평범하게 살고 싶은 월급쟁이 기술적인 토론 환영합니다.같이 이야기 하고 싶으시면 부담 말고 연락주세요:이메일-bwcho75골뱅이지메일 닷컴. 조대협


Archive»


 
 

WorkFlow에서 CustomActivity 메모

프로그래밍/C# & .NET | 2010.11.13 12:45 | Posted by 조대협

- 각 Activity에서 State나 Static 변수등은 저장되지 않음. ThreadLocal도 마찬가지. Context에 저장해야 한다.
- DBActivity가 곧 나올 예정 (DataBaseActivity Pack이라는 형태로 제공될 예정)
  * 트렌젝션 Scope  및 관리 기능 있음
- CustomActivity는 NativeAcitivity,CodeActivity 등이 있음. CodeActivity는 Constraint가 심함, NativeActivity는 자유도가 제일 높음

Activity Designer
- Custom Activity에 대한 UI 디자이너.

AppFabric이 들어오면서 IIS 기반 프로그래밍 모델이 꽤 바뀌는 듯.
이런 자체는 좋은데, Context 객체를 통한 데이타 전달, Activity 별로 아마도 Session이나 Connection, 또는 Parsed  된 객체를 잘 다루지 못하면 성능에 영향이 꽤 있을듯.. 보기에는 쉽지만, 고성능을 내기에는 꽤 높은 코딩 경험과 설계가 필요할듯.

반나절 정도 투자해서 LAB해봐야겠다.

참고: Message Mediation Activity
http://www.codeproject.com/KB/WF/MessageMediation.aspx

신고

WCF 4.0으로 REST 서비스 구현하기

윈도폰 7 스터디 하다가, 다음 단계로 서버와 연결하려는 걸 하려고 생각하다 보니, REST 컴포넌트가 필요해서 어찌어찌하다가 .NET으로 REST 컴포넌트 를 구현해봤는데, 자바쪽에서 JAX-RS (Jersey)로 구현해봤던 경험때문인지 약 2일 정도만에 상당히 완성도 있는 REST 컴포넌트를 구현해낼 수 있었다.

REST의 개념과 디자인 방법에 대해서는 다른 문서를 참고하고. .NET에서 REST 구현 방법에 대해서 알아보도록 하자

기본 REST 서비스 구현

만들고자 하는 애플리케이션은 간단하다. 이메일을 KEY로하고, 이름과 전화번호를 저장하는 REST서비스를 만들것이다.

Visual Studio 2010에서는 WCF(Windows Communication Framework) 4.0 기반의 REST 구현 템플릿이 추가되었다.
New > Project에서 Visual C# 선택한 후 Web > WCF REST Service Application을 선택한다.


자동으로 만들어진 SampleItem 클래스는 Refactor해서 CotactVo로 이름을 변경한다. 파일명도 ContactVo.cs로 변경한다.

ContactVo.cs의 내용은 다음과 같다.

    [DataContract(Name="Contact")]
    public class ContactVo
    {

        public ContactVo(string email, string name, string phone)
        {
            this.email = email;
            this.name = name;
            this.phone = phone;
        }

        [DataMember(Order=2)]
        public string name { get; set; }

        [DataMember(Order = 1)]
        public string email { get; set; }

        [DataMember(Order = 3)]
        public string phone { get; set; }
    }

ValueObject가 나중에 REST 서비스에서 데이터 객체로 사용되기 때문에 명시적으로 [DataContract]라고 정의해준다. XML이나 JSON으로 변환될(Serialize) 데이터는 명시적으로[DataMember] 로 정의해준다. 각 데이터 멤버는 디폴트로 변수명이 XML 엘리먼트명이 되며, Class명 역시 이 ValueObject의 디폴트 엘리먼트명이 된다. ValueObjet XML로 변환되었을 때 XML 엘리먼트명은 [DataContract]에서 Name이라는 속성으로 지정할 수 있다. ValueObjectXML로 변환되면 다음과 같은 모양이 된다.

<Contact xmlns="http://schemas.datacontract.org/2004/07/WcfRestService">
  <email>String content</email>
  <name>String content</name>
  <phone>String content</phone>
</Contact>

Service1 클래스도 Refactor를 통해서 클래스명을 ContactService로 변경하고 파일명도 ContactService.cs로 변경한다.

ContactVo 데이터를 관리하기 위해서 가상의 DAO를 만든다. DAO에서는 간단하게 데이터를 메모리 상에서 관리한다. 만약에 데이터베이스에 저장하고 싶으면 이 DAO를 나중에 ADO와 연결 시켜서 구현하면 된다 (편의상 인터페이스를 이용한 설계 등등등은 뺏으니 태클 걸지 마시기를.) Add > Class 선택 후, ContactDao 클래스를 생성하고 ContactDao.cs에 저장한다.

ContactDao.cs의 내용은 다음과 같다. (간단하게 Dictionary email Key ContactVo CRUD하는 구조이다.)

    public class ContactDao
    {

        static Dictionary<string, ContactVo> contacts = new Dictionary<string, ContactVo>(); 

        public void add(string email, ContactVo contact)
        {
            contacts.Add(email, contact);
        }

        public void update(string email, ContactVo contact)
        {
            contacts[email] = contact;
        }

        public ContactVo get(string email)
        {
            return contacts[email];
        }

        public void remove(String email)
        {
            contacts.Remove(email);
        }

        public List<ContactVo> getList()
        {
            return new List<ContactVo>(contacts.Values);
        }

    }

다음으로 ContactService 클래스를 통해서 CREATE,DELETE,UPDATE,READ 를 구현한다. 단순하게 인자를 받은 후에 DAO를 통해서 데이터를 저장 ,쿼리 한다.

       [WebInvoke(UriTemplate = "", Method = "POST")]
        public void Create(ContactVo instance)
        {
            dao.add(instance.email, instance);
        }

        [WebGet(UriTemplate = "{email}")]
        public ContactVo Get(string email)
        {
            return dao.get(email);
        }

        [WebInvoke(UriTemplate = "{email}", Method = "PUT")]
        public void Update(string email, ContactVo instance)
        {
            dao.update(email, instance);
        }

        [WebInvoke(UriTemplate = "{email}", Method = "DELETE")]
        public void Delete(string email)
        {
            dao.remove(email);
        }

여기서 주목해야할 부분은 [WebInvoke] 부분인데, 여기에 URI를 통해서 넘어가는 인자와 HTTP 메서드를 정의한다. URI에 인자가 들어갈 경우에는 {인자}로 정의하고, Query String을 사용할 경우에는 ?queryname={인자} 식으로 정의한후, 메서드에서 해당 인자를 넣어주면 된다. 예를 들어 /Contact/{email} 식으로 Resource URI를 지정해서 email을 인자로 사용하고 싶으면 UriTemplate=”{email}”이 되고, 메서드는 Method(string email)이 된다. POST PUT의 경우에는 Resource의 데이터 자체를 변경하기 때문에, HTTP Body ContactVo의 데이터 내용이 들어가야 하기 때문에 메서드의 인자로 ContactVo가 같이 들어간다.


Update 메서드의 경우 위와 같이 맵핑 된다.
그리고 Base URL, 이 리소스의 URL을 정의해야 하는데, BaseURL Global.asax.cs RegisterResource 부분에 정의되어 있다.

        private void RegisterRoutes()
        {
            // Edit the base address of Service1 by replacing the "Service1" string below

            RouteTable.Routes.Add(new ServiceRoute("WcfContactService", new WebServiceHostFactory(), typeof(ContactService)));
        } 

RouteTable에 의해서 관리가 되는데, ServiceRoute의 명을 “WcfContactService”로 바꾸고, typeof의 클래스명을 ContactService로 변경한다 이렇게 되면, {이 웹 애플리케이션이 배폰된 URL}/WcfContactService Resource URL이 되는 것이다.

이제 F5키를 눌러서 실행을 해보면 자동으로 컴파일이 되고 테스트용 웹서버에 자동 배포가 된 후에 웹 브라우져가 자동으로 수행된다. URLhttp://localhost:37055/WcfContactService/help 를 넣어보면 다음과 같은 화면이 나온다.( 포트명은 바뀔 수 있음)


해당 Resource에 대해서 수행할 수 있는 메서드와 종류와 HTTP Method가 나온다. Http Method를 클릭하면 상세하게 해당 메서드에 대한 호출 방법, 샘플 데이터,XML 스키마들이 출력된다.


사실 REST의 문제가 SOAP기반의 웹서비스와는 다르게 WSDL이 없기 때문에, 정확한 호출 방법과 데이터에 대한 스키마가 없기 때문에 관리가 곤란한점이 있고, 개발가이드를 별도 배포해야 하는 불편함이 있지만, WCF에서는 이렇게 help 페이지를 통해서 해당 리소스에 대한 호출 방법을 개발자에게 알려준다.

여기까지 했으면 가장 기본적인 REST 서비스는 만들어졌다. 이제부터 테스트를 해보자.

1.     carry라는 이름의 Contact 생성

요청

POST http://localhost:37055/WcfContactService/ HTTP/1.1
Accept-Encoding: gzip,deflate
Content-Type: application/xml
User-Agent: Jakarta Commons-HttpClient/3.1
Host: localhost:37055
Content-Length: 154
 

<Contact xmlns="http://schemas.datacontract.org/2004/07/WcfRestService">
  <email>carry</email>
  <name>Carry.Chot</name>
  <phone>1234</phone>
</Contact>

2.     carry라는 이름의 Contact 정보 가지고 오기

요청

GET http://localhost:37055/WcfContactService/carry HTTP/1.1
Accept-Encoding: gzip,deflate
User-Agent: Jakarta Commons-HttpClient/3.1
Host: localhost:37055

응답

<Contact xmlns="http://schemas.datacontract.org/2004/07/WcfRestService" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
   <email>carry</email>
   <name>Carry.Chot</name>
   <phone>1234</phone>
</Contact>

 

위의 테스트는 무료 테스트 툴인 SoapUI 3.5.1 버전을 이용하였다. SoapUI 사용방법은 맨 마지막에 다루도록 하겠다.

Collection 데이터 처리

다음으로 살펴볼 부분은 List형태의 데이터(Collection)을 다루는 방법이다. 여러명의 Contact 목록을 ~/WcfContactService/ GET으로 접속하면 쭈욱 리스트 형태로 출력해 주는 API를 만들려고 한다. OPEN API에서 필수 적인 요소로 데이터베이스에서 쿼리해 온 데이터, 테이블 데이터들이 이들에 해당한다.

ContactService 클래스에 다음 내용을 추가한다.
 

        [WebInvoke(UriTemplate = "", Method = "GET")]
        public List<ContactVo> GetList()
        {
            return dao.getList();
        }

실행을 하고 테스트를 해보면 다음과 같은 결과를 얻을 수 있다.

요청

GET http://localhost:37055/WcfContactService/ HTTP/1.1
Accept-Encoding: gzip,deflate
User-Agent: Jakarta Commons-HttpClient/3.1
Host: localhost:37055

응답

<ArrayOfContact xmlns="http://schemas.datacontract.org/2004/07/WcfRestService" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">

   <Contact>
      <email>carry</email>
      <name>Carry.Chot</name>
      <phone>1234</phone>
   </Contact>

</ArrayOfContact>

여기서 주의 깊게 볼 점은 Contact 목록이 <ArrayOfContact>이라는 엘리먼트로 묶여 있다는 것이다.  GetList에서 리턴되어 오는 타입이 List<ContactVo> 타입인데, WCF에서는 List나 일반적인 Collection Type은 모드 <ArrayOf>로 묶어서 리턴하게 되어 있다. 그러면 이것을 바꾸고 싶다면? XML 엘리먼트 이름이 지정된 List 타입을 새로 생성하면 된다.
ContactVo.cs 파일에 ContactVo를 리스트로 묶어줄 새로운 List 타입을 정의한다.

    [CollectionDataContract(Name = "ContactList", ItemName = "Contact")]
    public class ContactList : List<ContactVo>
    {

        public ContactList() : base() { }
        public ContactList(IEnumerable<ContactVo> collection) : base(collection) { }

    }

이 데이터 타입은 List타입이기 때문에, [DataContract]이 아니라 [CollectionDataContact]으로 정의하고, Name 부분에 엘리먼트 이름을 정의해주면 된다.

그후에, WcfContractService클래스의 GetList함수를 다음과 같이 변경한다.

       [WebInvoke(UriTemplate = "", Method = "GET")]
        public ContactList GetList()
        {
            return new ContactList(dao.getList());

        }

ContactList 클래스는 일반 List 클래스가 아니라 XML로 변환시 “ContactList”라는 XML 엘리먼트를 가지도록 정의된 클래스이기 때문에, 실행시 다음과 같은 결과를 출력하게 된다.

<ContactList xmlns="http://schemas.datacontract.org/2004/07/WcfRestService" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">

   <Contact>
      <email>carry</email>
      <name>Carry.Chot</name>
      <phone>1234</phone>
   </Contact>

</ContactList>

XML Name 스페이스 변경하기

위의 예제들을 실행한 후에 XML 응답값들을 보면

<ContactList xmlns="http://schemas.datacontract.org/2004/07/WcfRestService" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">

XML 네임 스페이스들이 임의로 정해져있다. XML 네임스페이스는 얼핏 별거 아닐 수 도 있지만, 사용 용도에 따라서 여러가지 방안으로 사용할 수 있다. REST의 경우 데이터에 대한 스키마가 정의되어 있지 않기 때문에, 실제 XML 스키마 (XSD)나 매뉴얼의 URL XML 네임 스페이스로 지정해서 사용할 수 있다. 그렇다면 사용자가 직접 XML 네임 스페이스를 어떻게 지정하는가?

방법은 간단하다. DataContact이나 CollectionDataContract에 네임 스페이스를 지정해주면 된다.(ContactVo.cs에서 다음과 같이 변경한다.)

[CollectionDataContract(Namespace="http://RESTSample.bycho.com/ContactService",Name = "ContactList", ItemName = "Contact")]  

       [DataContract(Namespace = "http://RESTSample.bycho.com/ContactService", Name = "Contact")] 

변경을 한후에 ContactList를 받아보면 다음과 같이 출력된다.

<ContactList xmlns="http://RESTSample.bycho.com/ContactService"  xmlns:i="http://www.w3.org/2001/XMLSchema-instance"/>

위와 같이 XML 네임스페이스가 변경되었다.

에러 처리

다음은 REST의 에러 처리 방법이다. REST에서 에러 처리는 HTTP Response Code를 통해서 에러메세지를 보내고 필요에 따라서 상세 에러 메시지를 보내는 형태이다. 예를 들어 HTTP GET으로 해당 리소스를 요청했는데, 없을때는 404 Not Found를 로그인 인증이 실패했을때는 401 Unauthorized를 리턴하는 식이다. 에러 메시지에 대한 개념은http://msdn.microsoft.com/en-us/library/dd203052.aspx 문서를 참고하기 바라고, 여기서는 WCF 기반의 코딩 방법에 대해서 알아보자

HTTP GET으로 ~/WcfContactService/{email}을 호출했을 때, 해당 Contact이 없으면 404 Not Found와 에러를 내보내는 시나리오를 구현해보자

먼저 ContactDao 클래스의 get에서 Contact 객체가 있는지 없는지 찾아보고 없으면 KeyNotFoundException을 던지도록 수정하자

        public ContactVo get(string email)
        {
            if (!contacts.ContainsKey(email)) throw new KeyNotFoundException(email + " cannot be found");

            return contacts[email];

        }

다음으로 ContactService Get메서드에서 dao KeyNotFoundException을 던지면 404 NotFound를 리턴하도록 수정하자

        [OperationContract]
        [WebGet(UriTemplate = "{email}")]

        public ContactVo Get(string email)
        {
            ContactVo contact;
            try
            {
                contact = dao.get(email);
            }
            catch (KeyNotFoundException ex)
            {

                throw new WebFaultException<string>(ex.ToString(), HttpStatusCode.NotFound);

            }

            return contact;

        }

이부분이 핵심인데, WCF REST 에러 핸들링 방식은 여러가지가 있지만 WebFaultException 방식이 공식 문서에 언급되어 있다. HttpStatusCode와 에러 TextString을 보내 된다. 에러의 디테일 내용은 XML로 출력된다. (필요에 따라 JSON,TEXT등으로도 변경할 수 있음). 테스트 결과는 다음과 같다.

HTTP/1.1 404 Not Found
Server: ASP.NET Development Server/10.0.0.0
Date: Fri, 20 Aug 2010 08:47:18 GMT
X-AspNet-Version: 4.0.30319
Content-Length: 481
Cache-Control: private
Content-Type: application/xml; charset=utf-8
Connection: Close
 

<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">System.Collections.Generic.KeyNotFoundException: carry cannot be found&#xD;
   at WcfRestService.ContactDao.get(String email) in C:\Users\bycho\Documents\Visual Studio 2010\Projects\WcfRestService\WcfRestService\ContactDao.cs:line 22&#xD;
   at WcfRestService.ContactService.Get(String email) in C:\Users\bycho\Documents\Visual Studio 2010\Projects\WcfRestService\WcfRestService\ContactService.cs:line 37</string>

이 외에도 Http Custom Header 처리와 SOAP UI를 이용한 REST 테스트 방법등 몇가지 내용이 더 있는데, 오늘은 여기까지 하고, 나중에 잡지 기고할때 내용을 보강하던지 하겠다. 

            

저작자 표시
신고
TAG .NET, REST, WCF, WCF 4.0

WF (Workflow Foundation)

프로그래밍/C# & .NET | 2010.06.29 10:34 | Posted by 조대협
.NET에서 WCF와 함께 관심이 가는 것이 WF (Workflow Foundation)인데 말그대로 프로세스를 그릴 수 있는 프레임웍이다.
BPM,Orchestration 등등의 모든 프로세스를 디자인할 수 있는데,
흥미로운것중의 하나가, 이 WorkFlow 디자인 GUI를 떼어내서 다른 툴에서 쓸 수 있다는 것이다.
즉 Custom WorkFlow Designer를 만들 수 있다는 말씀.(Workflow Designer Re-Hosting)이라고 함.
사실 Mesh up 도구나 SDP의 SDE (Service Development Environment)등을 만들때 이 프로세스 디자이너를 구현하는게 꽤나 복잡한 부분인데, 이를 이용하면 해결할 수 있을듯.
[참고:http://msdn.microsoft.com/library/cc709458.aspx]

Scenario

Description

SharePoint 2007 and Workflow

SharePoint 2007 relies on Workflow technology for its packaged workflows, and for custom workflows created with SharePoint Designer 2007 or Visual Studio 2008.

Human Workflow

Workflow provides the underlying tools to support both human and system interaction according to business rules.

Workflow and WCF Services

Seamless integration between Workflow and WCF enables workflows to be exposed as services and to coordinate calls to WCF services.

Coordinating Presentation Flow

Both Windows and web applications can leverage workflows to drive presentation flow.

Workflow Designer Re-Hosting

Applications can host the Workflow Designer to provide a fully customized design experience for developers or business users.

신고
TAG .NET, WF, workflow

Oracle Coherence나 Open source memcached와 같은 메모리 그리드 솔루션은 아키텍쳐를 그리는 데 상당한 효과를 발휘한다. 메모리 그리드랑, 간단하게 이야기 하면 Java의 HashTable이 무제한 용량으로 확대 가능하고, 어느 server instance에서도 접근이 가능하며, 장애시 Fail over를 통해서 고가용 서비스가 가능한 솔루션을 이야기 한다.
물론 Oracle Coherence가 .NET도 지원하기는 하는데, 이왕이면 MS도 이런게 있었으면 했는데, 새 윈도우즈 Server에 나왔다.
AppFabric이라는 일종의 윈도우즈 미들웨어인데, 일단  데이타 그리드의 성격을 가지고 무제한 클러스터링이 가능하다.. (물론 열어봐야 알겠지만..)

데이타 그리드로써도 의미가 있지만, ASP.NET은 기본적으로 Http Session Clustering을 지원하지 않았기 때문에, 이 Data Grid를 이용하면 WebLogic이나 WebSphere와 같은 Session Clustering을 지원할 수 있다. (그것들 보다 지능적이게 만들려면 개발은 좀 들어가겠지만...)

아울러 AppFabric은 ESB Feature를 제공하는데, WCF (Windows Communication Foundation - 일종의 통신 Framework)과 WF (Workflow Foundation - 워크 플로우)를 통해서 비지니스 프로세스를 그리고 배포할 수 있다.  WF와 WCF 기반의 코딩이 들어가야 하는 미들웨어성에 가까운데, 대신 코딩을 하는 만큼 오히려 성능이나 아키텍쳐 구성에는 유리한면이 있을듯 하다.
Oracle Service Bus가 높은 가격과 고수준의 XQuery/XSL 기술이 있어야 한다면, 상대적으로 좀더 Flexible하게 고성능 ESB를 디자인할 수 있을듯.
기본적으로 IIS는 Java의 WAS처럼 Thread Base 모델이 아니라 Process Base 모델이기 때문에, Hot Deploy나, 장애 전파 영향도는 낮을 듯 하다.

AppFabric이 나오면서 기존의 ESB 역할을 해주던, BizTalk의 Postion이 애매해지는데, David Chappel의 AppFabric WhitePaper를 보면

As the figure shows, an activity in the workflow service can issue a request to BizTalk Server. This might be done using a Web service or in some other way; BizTalk Server provides adapters for several different communication styles. However it’s accomplished, the request can then be handled by business logic running in BizTalk Server. This logic is implemented as an orchestration, and it knows how to carry out the next step in this process. Here, for instance, the orchestration uses another BizTalk adapter to communicate directly with the ERP application. Any response can be sent back through the same components.

출처 : http://download.microsoft.com/download/7/F/8/7F8BD8A0-EB05-4DB5-A5A4-DD1D3C909A0A/Introducing_Windows_Server_AppFabric.pdf


AppFabric이 전통적인 ESB 역할을 하면서 Service Orchestration등을, BizTalk는 EAI 또는 SOA에서 Service Enablement Layer처럼, Legacy 시스템들을 Itnegration해서 Expose하는 역할로 포지셔닝이 된다. (참고 : http://wm.microsoft.com/ms/msdn/windowsserver/WFDemoFinalHighRes.wmv )


일단 1 core에 몇천만원이나 하는 Service Bus보다, MS의 AppFabric은 단돈 몇백만원에 OS에 포함되어 있고, 개발 용이성도 높으니, REST와 함께해서 아키텍쳐를 한번 조합해봤으면 좋겠는데..

혹시.. 사이트에 좀 불러주실분...??? 손!! :)

저작자 표시
신고

WCF REST 구현시 URL Rewriting

프로그래밍/C# & .NET | 2010.06.28 16:24 | Posted by 조대협

URL rewriting이란, WebServer에 들어온 Request의 URI를 변경해서 WAS에 전달하는 것이다.
예를 들어
http://localhost/service/Customer 이런것을 http://localhost/Customer 식으로 특정 문자열을 빼거나 더할 수 도 있고
http://www.store.com/products.aspx?category=books 게 들어온 요청을 http://www.store.com/products/category/books 이렇게 바꿀 수 도 있다...

RESTful 설계시에 매우 유용한데, 예전에 WebLogic으로 구현했을때는 Apache Proxy Plug in 을 이용했는데, IIS에서도 비슷한 형태로 구현이 가능할듯..

자료 원본  : http://weblogs.asp.net/scottgu/archive/2007/02/26/tip-trick-url-rewriting-with-asp-net.aspx
저작자 표시
신고
당연히 될줄 알았지만 생각보다 쉽게 된다.
==
15 private void SetCaching(WebOperationContext context, DateTime lastModifiedDate, Int32 maxCacheAge){
16    
17     // set CacheControl header
18     HttpResponseHeader cacheHeader = HttpResponseHeader.CacheControl;
19     String cacheControlValue = String.Format("max-age={0}, must-revalidate", maxCacheAge);
20     context.OutgoingResponse.Headers.Add(cacheHeader, cacheControlValue);
21
22     // set cache validation
23     context.OutgoingResponse.LastModified = lastModifiedDate;
24     String eTag = context.IncomingRequest.UriTemplateMatch.RequestUri.ToString() + lastModifiedDate.ToString();
25     context.OutgoingResponse.ETag = eTag;
26
27 }
==
원본 http://blogs.msdn.com/b/justinjsmith/archive/2007/08/22/setting-http-headers-in-wcf-net-3-5.aspx
신고

WCF가 예전에 REST 지원한다는 이야기가 생각나서, SDP 플랫폼 구현 가능성 체크해볼라고 간략하게 체크해봤다.
WCF에서 REST개발은 별도의 라이브러리가 필요하다. VS2010환경에 낮선 나로써는 좀 더 쉬운 방법을 찾아야 했는데, Project Template이 REST용으로 세팅되어 있는게 있다.
New > Project에서 Online Template을 선택한후에, WCF REST C# 템플릿을 선택하면 된다.

사용자 삽입 이미지


자동으로 생성된 코드를 체크하고, 간단하게 테스트를 해봤는데... 일단 잘된다.
프로그래밍 모델도 자바의 Jersey나 Apache CXF와 비슷하다 (JAX-RS 스펙과 유사)

    [ServiceContract]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
    // NOTE: If the service is renamed, remember to update the global.asax.cs file
    public class Service1
    {
        // TODO: Implement the collection resource that will contain the SampleItem instances

        [WebGet(UriTemplate = "")]
        public List<SampleItem> GetCollection()
        {
            // TODO: Replace the current implementation to return a collection of SampleItem instances
            return new List<SampleItem>() { new SampleItem() { Id = 1, StringValue = "Hello" } };
        }

코드가 이런데, 테스트를 해보면 다음과 같은 결과가 나온다.

사용자 삽입 이미지

일단은 합격점인데.. 조금더 살펴보아야할점이 Annotation이 얼마나 다양하냐이다.
1. 위의 결과값처럼 List에 대한 리턴 XmlElement가 ArrayOf로 시작한다. 실제 REST에서는 이걸 마음대로 바꿀 수 있어야 하고
2. Namesapce역시 scheme를 여기 넣는 디자인이 있을 수 있기 때문에, name space를 마음대로 지정할 수 있는지.
3. 그리고 HTTP Header에 얼마나 데이타를 쉽게 조작할 수 있는지가 관건이다.

개발환경이나 세팅이 자바에 비해서 쉽기는 한데.. (WAS설치나 Library 설치). 이상하게도 WCF 4.0에 REST 프레임웍이 기본 번들이 안되어 있어서 찜찜하기는 하다...

그리고 MS의 장점이겠지만, 문서화는 진짜 잘되어 있다.
http://msdn.microsoft.com/en-us/library/dd203052.aspx 참고 자료.
예전 Jersey가지고 REST설계할때 SPEC때문에 고민도 많이하고 스터디도 많이 했는데, 참 잘나와 있는듯...

참고자료
http://techsavygal.wordpress.com/2009/03/10/getting-started-with-rest-in-wcf/

신고

WCF가 몬가 했더니..

프로그래밍/C# & .NET | 2010.06.25 11:52 | Posted by 조대협
간단하게 튜토리얼 보고 테스트 프로그램 하나 짜서 송수신 전문을 봤더니...

송신 전문
<s:Envelope xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:s="http://www.w3.org/2003/05/soap-envelope">
  <s:Header>
    <a:Action s:mustUnderstand="1">http://tempuri.org/IEvalService/GetEvals</a:Action>
    <a:MessageID>urn:uuid:489b8c48-e094-418e-8f6b-60321ffc9d38</a:MessageID>
    <a:ReplyTo>
      <a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>
    </a:ReplyTo>
  </s:Header>
  <s:Body>
    <GetEvals xmlns="http://tempuri.org/" />
  </s:Body>
</s:Envelope>

수신 전문
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
  <s:Header>
    <a:Action s:mustUnderstand="1" u:Id="_2">http://tempuri.org/IEvalService/GetEvalsResponse</a:Action>
    <a:RelatesTo u:Id="_3">urn:uuid:dfac6ed4-fbcc-46d6-9fd8-38ed4604aa4c</a:RelatesTo>
    <o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
      <u:Timestamp u:Id="uuid-20a62935-2716-472d-ba79-1581763744f3-17">
        <u:Created>2010-06-25T02:50:53.419Z</u:Created>
        <u:Expires>2010-06-25T02:55:53.419Z</u:Expires>
      </u:Timestamp>
      <c:DerivedKeyToken u:Id="uuid-20a62935-2716-472d-ba79-1581763744f3-7" xmlns:c="http://schemas.xmlsoap.org/ws/2005/02/sc">
        <o:SecurityTokenReference>
          <o:Reference URI="urn:uuid:9ab8a01d-b2fb-40b4-bcee-e057f49e1a93" ValueType="http://schemas.xmlsoap.org/ws/2005/02/sc/sct" />
        </o:SecurityTokenReference>
        <c:Offset>0</c:Offset>
        <c:Length>24</c:Length>
        <c:Nonce>pxd/ozyLoq7PsUk2mw2X2A==</c:Nonce>
      </c:DerivedKeyToken>
      <c:DerivedKeyToken u:Id="uuid-20a62935-2716-472d-ba79-1581763744f3-8" xmlns:c="http://schemas.xmlsoap.org/ws/2005/02/sc">
        <o:SecurityTokenReference>
          <o:Reference URI="urn:uuid:9ab8a01d-b2fb-40b4-bcee-e057f49e1a93" ValueType="http://schemas.xmlsoap.org/ws/2005/02/sc/sct" />
        </o:SecurityTokenReference>
        <c:Nonce>3eijqwLZYaqrBjcduAkjow==</c:Nonce>
      </c:DerivedKeyToken>
      <e:ReferenceList xmlns:e="http://www.w3.org/2001/04/xmlenc#">
        <e:DataReference URI="#_1" />
        <e:DataReference URI="#_4" />
      </e:ReferenceList>
      <e:EncryptedData Id="_4" Type="http://www.w3.org/2001/04/xmlenc#Element" xmlns:e="http://www.w3.org/2001/04/xmlenc#">
        <e:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes256-cbc" />
        <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
          <o:SecurityTokenReference>
            <o:Reference ValueType="http://schemas.xmlsoap.org/ws/2005/02/sc/dk" URI="#uuid-20a62935-2716-472d-ba79-1581763744f3-8" />
          </o:SecurityTokenReference>
        </KeyInfo>
        <e:CipherData>
          <e:CipherValue>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</e:CipherValue>
        </e:CipherData>
      </e:EncryptedData>
    </o:Security>
  </s:Header>
  <s:Body u:Id="_0">
    <GetEvalsResponse xmlns="http://tempuri.org/">
      <GetEvalsResult xmlns:a="http://schemas.datacontract.org/2004/07/EvalServiceLibrary" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
        <a:Eval>
          <a:Comments>Test Comment</a:Comments>
          <a:Id>7c88a50c-cb86-4a94-934a-8552532bc2db</a:Id>
          <a:Submitter>bycho</a:Submitter>
          <a:TimeSubmitted>2010-06-25T11:48:00</a:TimeSubmitted>
        </a:Eval>
      </GetEvalsResult>
    </GetEvalsResponse>
  </s:Body>
</s:Envelope>

웹서비스다... 설마 이게 다는 아니겄지... REST 구현 함 찾아봐야 쓰겄다.
신고
WCF Quick Tutorial
개념잡기 딱 좋음

신고
TAG C#, Tutorial, WCF

Windows 7에서 IIS 설치하기

프로그래밍/C# & .NET | 2010.05.13 13:35 | Posted by 조대협
IIS는 Windows7 제어판에서 Feature 옵션에서 다시 설정해주면 자동 설치되고
Admin 화면 역시 제어판에서 Admin 툴로 들어가면 된다.

설치 방법은
http://technet.microsoft.com/en-us/library/cc731911.aspx
관리화면 들어가는 방법은
http://digitizor.com/2009/06/20/manage-settings-iis-web-server-ftp-server-in-windows-7/

신고

'프로그래밍 > C# & .NET' 카테고리의 다른 글

WCF가 몬가 했더니..  (0) 2010.06.25
WCF (Windows Communication Foundation) Quick Tutorial  (0) 2010.06.25
Windows 7에서 IIS 설치하기  (1) 2010.05.13
.NET 튜닝 옵션  (0) 2010.05.12
CLR 메모리 구조 (노트)  (0) 2010.05.12
자바개발자가 본 .NET 프레임웍  (0) 2010.05.11

.NET 튜닝 옵션

프로그래밍/C# & .NET | 2010.05.12 00:34 | Posted by 조대협
http://msdn.microsoft.com/en-us/library/ff647813.aspx#scalenetchapt17_topic13
GC 튜닝 옵션좀 찾아볼려고 검색해봤는데.. GC 튜닝 옵션은 없는거 같고.. -,.-
ADO.NET에서 Connection Pool 튜닝 하는 것도 SqlConnection String으로 하는것 같고.. -,.-
시간 나면 천천히좀 봐야 쓰겄다.
신고

'프로그래밍 > C# & .NET' 카테고리의 다른 글

WCF (Windows Communication Foundation) Quick Tutorial  (0) 2010.06.25
Windows 7에서 IIS 설치하기  (1) 2010.05.13
.NET 튜닝 옵션  (0) 2010.05.12
CLR 메모리 구조 (노트)  (0) 2010.05.12
자바개발자가 본 .NET 프레임웍  (0) 2010.05.11
ApplicationDomain  (0) 2010.05.11

CLR 메모리 구조 (노트)

프로그래밍/C# & .NET | 2010.05.12 00:01 | Posted by 조대협

CLR 메모리 참고 자료
http://www.simple-talk.com/dotnet/.net-framework/understanding-garbage-collection-in-.net/
에 있는데, JVM이 client모드와 server모드가 있듯이 workstation 모드와 server 모드 두개를 가지고 있다. (current and synchronous). 간략하게 정리하자면 concurrent mode는 JVM의 concurrent GC 모드와 유사하게 pause time을 최소화하는 것이고 주로 desk ap에서 응답 시간 위주로 튜닝하고자할때 사용되고, synchronous 모드는 JVM의 Thoughput collector와 비슷한 원리 같은데, pause를 주더라도 collection을 빨리하는 데 목적을 두고, 주로 Server ap에서(ASP.NET과 같은) 디폴트로 설정된다.
일단 GC 방법은 JVM과 유사한것 같고

The .NET collector has two main modes of operation: concurrent and synchronous (sometimes known as workstation and server). Concurrent garbage collection is used in desktop applications and synchronous is used in server applications such as ASP.NET by default.

In concurrent mode, .NET will try to avoid stopping the running program while a collection is in progress. This means that the total amount that the application can get done in a given period of time is less but the application won’t pause. It’s good for interactive applications where it’s important to give the impression to the user that the application is responding immediately.

In synchronous mode, .NET will suspend the running application while the garbage collector is running. This is actually more efficient overall than concurrent mode - garbage collection takes the same amount of time, but it doesn’t have to contend with the program continuing to run - but means that there can be noticeable pauses when a full collection has to be done.


메모리 Layout 역시 GC후에 Compaction 작업이 일어나면 Old Object를 Lower address로 옮긴다. 이렇게 해서 객체의 이동을 좀 줄이는 방식 같은데..  이 역시 Compaction을 사용하고 알고리즘은 JVM과 같게 Mark & Sweep을 사용한다.



위의 그림처럼 Heap 영역을 g0,g1,g2로 나누고 Old Object일수록 g2쪽에 놓는다. JVM의 New/Eden/Old 영역 사상과 좀 유사하다.어쨌거나  자세한 아키텍쳐는 뜯어봐야 겠고, Native Code에 의해서 Allocate되는등 특정 Address 위치에 Object가 Allocation되면 Pinned Object라고 해서 Fragmentation을 유발한다. 이건 Native Code도 같이 쓰니까는 어쩔 수 없는 것 같고.

GC 알고리즘이야 Root 객체에서 부터 Graph Traverse해가는 방식이라서 이건 유사한듯 보인다.
JVM에 Minor GC와 Full GC가 있는것 처럼 CLR에도 Partial Collection과  Full GC가 있다.
참고 : http://msdn.microsoft.com/en-us/library/ms973837.aspx
JVM에서 Minor GC가 New 영역을 Collection하는 거라면 CLR에서는 New한 Generation을 Collection 하는게 Partial Collection으로 이해된다. (g0 영역을 collection 하면 Partial)

Partial Collections

Unfortunately, the full garbage collection is simply too expensive to do every time, so now it's appropriate to discuss how having generations in the collection helps us out.

First let's consider an imaginary case where we are extraordinarily lucky. Let's suppose that there was a recent full collection and the heap is nicely compacted. Program execution resumes and some allocations happen. In fact, lots and lots of allocations happen and after enough allocations the memory management system decides it's time to collect.

Now here's where we get lucky. Suppose that in all of the time we were running since the last collection we didn't write on any of the older objects at all, only newly allocated, generation zero (gen0), objects have been written to. If this were to happen we would be in a great situation because we can simplify the garbage collection process massively.

Instead of our usual full collect we can just assume that all of the older objects (gen1, gen2) are still live—or at least enough of them are alive that it isn't worth looking at those objects. Furthermore, since none of them were written (remember how lucky we are?) there are no pointers from the older objects to the newer objects. So what we can do is look at all the roots like usual, and if any roots point to old objects just ignore those ones. For other roots (those pointing into gen0) we proceed as usual, following all the pointers. Whenever we find an internal pointer that goes back into the older objects, we ignore it.

When that process is done we will have visited every live object in gen0 without having visited any objects from the older generations. The gen0 objects can then be condemned as usual and we slide up just that region of memory, leaving the older objects undisturbed.

Now this is really a great situation for us because we know that most of the dead space is likely to be in younger objects where there is a great deal of churn. Many classes create temporary objects for their return values, temporary strings, and assorted other utility classes like enumerators and whatnot. Looking at just gen0 gives us an easy way to get back most of the dead space by looking at only very few of the objects.

Unfortunately, we're never lucky enough to use this approach, because at least some older objects are bound to change so that they point to new objects. If that happens it's not sufficient to just ignore them.


http://dotnetperls.com/garbage-collection 요건 .NET GC 내용을 그래프로 보는것 (HP JVM의 Jtune와 비슷)

조금 색다른것 중에 하나가 CLR 은 메모리 관리에 있어서 작은 객체영역과 85K가 넘는 대형 객체를 위한 영역을 나눠서 관리한다는 것이다. 일반적인 객체는 작은 객체 영역인 SOH (Small Object Heap)에 Allocation이 되고, 큰 객체(85K)이상은 LOH (Large Object Heap)에 Allocation이 된다. LOH는 G2 영역에 Allocation이 된다. Large Object는 오래 사용될것으로 예상되고 Collection상의 Overhead가 크기 때문에 Full GC 시에만 Collecting하기 위함이다.
LOH 영역은 Collection이 된후에도 Compaction이 되지 않고 Free Block으로 남아있고, LOH는 이 Free Block에 대한 List로 관리가 된다. 만약에 Free Block의 크기가 Allocation을 시도하고자 하는 Object 크기 보다 작을 경우 (Fragmentation으로 인해서) 추가로 메모리 Allocation을 요청할 수 있다. (이 메커니즘은 아직 이해안됨..). 모 하여간 이런 Large Object가 발생하는거는 주로 Buffer나 Array인 경우니까는 튜닝 가이드 보니까, 이런 Large Object에 의한 Fragmentation을 막기 위해서 Buffer는 되도록이면 재사용하라고 나와 있네 그랴.. 일단 LOH에 대한 상세한 자료는 http://msdn.microsoft.com/en-us/magazine/cc534993.aspx 여기

일단 호기심에서 한시간 정도 쭈욱 훝어보고 메모해놨는데, 실제 튜닝할려면 몇일 더 봐야 할듯.. 일단 다른것도 쭈욱 훝어 봐야 하니.. 링크만 걸어놓고..
패쓰~~

참고 자료
http://msdn.microsoft.com/en-us/library/ms973837.aspx
http://msdn.microsoft.com/en-us/magazine/bb985010.aspx
http://msdn.microsoft.com/en-us/magazine/cc534993.aspx

저작자 표시
신고

'프로그래밍 > C# & .NET' 카테고리의 다른 글

Windows 7에서 IIS 설치하기  (1) 2010.05.13
.NET 튜닝 옵션  (0) 2010.05.12
CLR 메모리 구조 (노트)  (0) 2010.05.12
자바개발자가 본 .NET 프레임웍  (0) 2010.05.11
ApplicationDomain  (0) 2010.05.11
Microsoft Sync Framework (MSF)  (1) 2010.05.10

자바개발자가 본 .NET 프레임웍

프로그래밍/C# & .NET | 2010.05.11 23:21 | Posted by 조대협
.NET 프레임웍이란?

MS에서 개발한 프레임웍으로
  • 개발 환경 : 다양한 컴파일 환경과, C#,VB등의 언어를 지원하고 있다.
  • 개발 프레임웍
    • 다양한 라이브러리들을 제공한다. ASP.NET과 같은 MVC기반의 웹개발환경
    • WebForm과 같은 웹 UI환경
    • WPF와 같은 클라이언트 UI개발
    • WCF와 같은 통신 프레임웍
    •  ADO.NET과 같은 DB 접근용 개발 프레임웍등을 제공한다.
  • 런타임 프레임웍 : 자바와 유사하게, Virtual Machine과 같은 런타임환경을 지원한다.

이다.


.NET 프레임웍의 런타임 동작 방식
.NET으로 만들어진 프로그램은 컴파일된후 .exe 파일로 존재하는데, 이 exe 파일은 실제 실행 파일이 아니라 자바의 .class 파일 처럼 Machine에 종속적이지 않은 byte code와 같은 형태로 존재한다.  .NET에서는 byte code와 같은 중간 컴파일된 코드를 Managed Code라고 한다. C++이나 C를 이용해서 Machine depedent된 Native Code를 UnManaged Code라고 한다.
이 Managed Code는 일종의 Assembly 코드 처럼 Instruction들로 이루어 지는데, 이 Instruction을  MSIL (Microsoft Intermediate Language)라고 한다. C#,COBOL,VB등의 다양한 언어로 애플리케이션을 작성했다 하더라도, 1차 컴파일이 되면, 이 MSIL로 구성된 Managed Code로 컴파일이 되는 것이다. 이런 특징 때문에, .NET에서 제공되는 모든 라이브러리는 .NET 프레임웍을 사용하는 모든 언어에 공통적으로 재사용될 수 있다.

이 IL은 런타임에 JIT 컴파일러에 의해서 Machine code로 바뀌어서 실행이된다. .NET이 일종의 Runtime 실행환경(JVM처럼)이 되는 것인데, 이런 .NET의 Runtime 실행환경을 CLR (Common Lnauage Run-time)이라고 한다.
CLR은 JIT 컴파일러 이외에도 자체적인 가상 메모리 관리,Garbage Collection, Thread관리와 같이 .NET 애플리케이션에 대한 전반적인 실행환경을 제공하는데, 이러한 Runtime 환경이 있기 때문에, 이 포스트에 앞서 설명한 Application Domain같은 것이 구현이 가능하다.

전체적으로 구성을 보면 자바와 매우 유사하다. JVM과 같은 CLR 런타임 환경이 있고, CLR이 GC를 수행하는것도 상당히 유사하다. 또한 컴파일된 코드가 자바에서 byte code로 컴파일되는것 처럼 Managed Code라는 형태로 컴파일 된후에, Runtime에서 JIT에 의해서 Machine 코드로 컴파일되는 것도 유사하다.

아키텍쳐 상으로만 봤을때는 앞서 설명한(이전 포스트) Application Domain과 같은 Runtime 환경은 .NET쪽이 좀더 진보적인 형태같고, Hotspot 방식의 컴파일러를 사용하는 자바가 Runtime 컴파일 환경에서는 조금더 발전하지 않은가 싶다.

조금 의문이 있는 것은 자바의 경우 GC 타임에 대한 성능적 이슈가 크기 때문에, GC 튜닝이 매우 중요한데 반해서, GC를 사용하는 .NET에서는 GC 타임이나 튜닝에 대해서 들어본적이 없다. GC 성능이 매우 좋을 경우에나 가능한 일인데.. 이건 좀 더 찾아봐야 할듯..

참고 자료
http://www.devhood.com/training_modules/dist-a/Intro.NET/Intro.NET_pres_files/frame.htm


저작자 표시
신고

'프로그래밍 > C# & .NET' 카테고리의 다른 글

.NET 튜닝 옵션  (0) 2010.05.12
CLR 메모리 구조 (노트)  (0) 2010.05.12
자바개발자가 본 .NET 프레임웍  (0) 2010.05.11
ApplicationDomain  (0) 2010.05.11
Microsoft Sync Framework (MSF)  (1) 2010.05.10
ildasm (C# 디컴파일러)  (3) 2010.05.10

ApplicationDomain

프로그래밍/C# & .NET | 2010.05.11 11:22 | Posted by 조대협
.NET에는 Application Domain이라는 개념이 있는데,
사실 시스템의 장애에서 가장 중요한것은 장애의 발생을 막는것도 중요하지만, 장애가 다른 애플리케이션으로 전파되지 않도록 막는것이다.
OS에서는 Process가 가장 작은 단위로 별도의 주소 공간, 별도의 Thread 공간을 가지고 가지기 때문에 일반적으로 Process가 가장 작은 Isolation 단위이다.
.NET에서는 이를 확장해서 ApplicationDomain이라는 개념을 사용하는데,
하나의 Process를 ApplicationDomain이라는 논리적인 단위로 나눠서 관리하고, 하나의 Application이 하나의 ApplicationDomain 위에서 동작된다. 각 Application Domain은 독립된 주소 공간과 Thread Pool을 가지게 되고, 마치 독립된 형태처럼 동작한다. 각 주소공간은 Virtual Address로 .NET의 CLR이 실제 Physical Address로 mapping해준다 즉 CLR이 OS위에 올라가는 조그만 OS처럼 동작한다.

각 Application은 다른 Application Domain의 주소 공간을 침범할 수 없으며, 서로 다른 Security Role을 가지고도 동작이 가능하다.
무엇보다 흥미로운것중의 하나가, Application Domain단위로 Application을 Load/UnLoad가 가능하다는 것이다. 즉 이말은 특정 Application이 문제가 있으면 내리거나 또는 Reload가 가능하다는 이야기다.

Java기반의 WAS에서는 Thread Pool을 나눠서 업무를 관리하는데
ASP.NET에서는 ApplicationDomain 단위로 업무를 나눌 수 있기 때문에 장애에 대한 전파성이 훨씬 낮다. Java의 경우 하나의 Thread가 잘못되서 Lock을 잡거나 하면 다른 업무까지 장애가 전파될 수 있고, 또는 해당 업무를 Restart하려면 다른 업무도 같이 restart가 되어야 한다. (하나의 프로세스이기 때문에) 그러나 ASP.NET에서는 특정 ApplicationDomain만 restart하면 되고, 혹시 문제가 생겼다 하더라도 다른 ApplicationDomain 공간을 침범(Thread나 메모리를)하지 않기 때문에 장애 전파를 막는데 아주 효과적으로 보인다.

ApplicationDomain간의 호출은 ApplicationDomain은 완벽하게 논리적으로 분리된 공간이기 때문에, Applciation Domain간에 Object를 share할 수 없다. WebService나 Remoting Service를 이용해야 하는데, 흥미로운것중 하나는 Remoting을 이용할때, 이 Object는 Internal Object sharing용으로 Marshraring되어서 IPC(Inter-Process-Call)을 위한 Marsharing보다 Cost가 싸게 먹힌다는 것이다.

일단 구조적으로는 Java 기반의 WAS보다는 상당히 진보한것 처럼 보이는데, 실제로는 어떻게 돌아가는지 사실 겪어봐야 알겠다. :)

저작자 표시
신고

'프로그래밍 > C# & .NET' 카테고리의 다른 글

CLR 메모리 구조 (노트)  (0) 2010.05.12
자바개발자가 본 .NET 프레임웍  (0) 2010.05.11
ApplicationDomain  (0) 2010.05.11
Microsoft Sync Framework (MSF)  (1) 2010.05.10
ildasm (C# 디컴파일러)  (3) 2010.05.10
C# 책 추천 부탁합니다.  (4) 2010.05.06

Microsoft Sync Framework (MSF)

프로그래밍/C# & .NET | 2010.05.10 17:23 | Posted by 조대협

오늘 제안 관련해서 잠깐 살펴본 내용인데, MS에는 MSF라는 프레임웍이 있다.
무엇인가 하니, 두개의 DataSource를 동기화 시켜주는 것이다. Outlook client와 Win Phone 동기화 시켜주는것, ITunes에서 컨텐츠 동기화와 같은 동기화가 대표적인 예이다.
MSF는 소스 데이타스토어(이하 DS)에서 타겟 DS로 데이타를 동기화 시켜주는데, 기본적인 원리 자체는 소스 DS의 Item들에 Time stamp 등을 달아서, SRC와 DES을 비교하여 동기화를 해주고, 만약에 Confliction이 발생하면 Call back에 정의된 Rule에 따라서 Confliction을 처리해주게 된다.


간단한거 같은데, 왜 MSF가 필요하냐?
일단 구조를 보면, 데이타를 가지고 오고 비교하기 위한 일종의 데이타 드라이버와 같은 역할을 하는것이 Sync Provider이다. (일종의 JDBC와 유사하지만 좀더 확장된 개념) 그리고 각 Item에 대한 업데이트 정보를 Meta data repository에 유지한다.
Sync Provider만 구현하면 되기 때문에 어느 DS에나 다 사용할 수 있다. (물론 구현은 해야겠지만). 그리고 이미 ADO.NET을 지원하는 DB는 Sync Provider를 지원하고, 이외에도 File과 RSS Feed에 대한 Sync Provider를 지원한다.
 이외에도 Predefined된 Confliction Handling Logic을 제공한다.
기능만 보면 EAI 용도로도 쓸 수 있을것 같기는 한데, 만약 가능했다면 벌써 썼을테고.. 아마 소량의 데이타 동기화나 Portable Device/Embedded Device 데이타 동기화에 주로 사용되지 않나 싶나.

직접 짜봐야 이해가 되는데, 아직도 C# 문법가지고 헤매고 있어서, 코드를 봐도 눈에 확 안들어오는데.. 이를 우짜면 좋나... :)
오늘 .NET FW 책 사러 가야겠습니다.
저작자 표시
신고

'프로그래밍 > C# & .NET' 카테고리의 다른 글

CLR 메모리 구조 (노트)  (0) 2010.05.12
자바개발자가 본 .NET 프레임웍  (0) 2010.05.11
ApplicationDomain  (0) 2010.05.11
Microsoft Sync Framework (MSF)  (1) 2010.05.10
ildasm (C# 디컴파일러)  (3) 2010.05.10
C# 책 추천 부탁합니다.  (4) 2010.05.06

ildasm (C# 디컴파일러)

프로그래밍/C# & .NET | 2010.05.10 17:07 | Posted by 조대협

C#에도 자바의 JAD와 비슷하게 디컴파일툴이 있는데,
ildasm.exe라는 도구이다.

*.exe 파일을 ildasm을 통해서 디컴파일 해보면 어셈블리코드로 대략 어떤 작업을 하고 있는지 볼 수 있다. (Reverse engineering할때 유용할듯)

사용방법은
프로그램 > 시작 > Visual Studio Folder > Visual Studio Command Prompt를 실행한 후
ildasm 을 치면 GUI 툴이 뜬다.

파일메뉴에서 EXE 파일을 열면 된다.
보고싶은 메서드를 더블 클릭하면 어셈블리 코드를 보여준다.
아래는 간단한 HelloWorld.cs를 디어셈블해본 내용

HelloWorld.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace HelloWorld
{
    class Program
    {
        static void Main(string[] args)
        {
            String str = Console.ReadLine();

            Console.WriteLine("Hello :"+str);
        }
    }

}

디어셈블한 결과


.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       25 (0x19)
  .maxstack  2
  .locals init ([0] string str)
  IL_0000:  nop
  IL_0001:  call       string [mscorlib]System.Console::ReadLine()
  IL_0006:  stloc.0
  IL_0007:  ldstr      "Hello :"
  IL_000c:  ldloc.0
  IL_000d:  call       string [mscorlib]System.String::Concat(string,
                                                              string)
  IL_0012:  call       void [mscorlib]System.Console::WriteLine(string)
  IL_0017:  nop
  IL_0018:  ret
} // end of method Program::Main


 


저작자 표시
신고

'프로그래밍 > C# & .NET' 카테고리의 다른 글

CLR 메모리 구조 (노트)  (0) 2010.05.12
자바개발자가 본 .NET 프레임웍  (0) 2010.05.11
ApplicationDomain  (0) 2010.05.11
Microsoft Sync Framework (MSF)  (1) 2010.05.10
ildasm (C# 디컴파일러)  (3) 2010.05.10
C# 책 추천 부탁합니다.  (4) 2010.05.06

C# 책 추천 부탁합니다.

프로그래밍/C# & .NET | 2010.05.06 17:15 | Posted by 조대협
C# 과 .NET 공부 해보려고 합니다.
괜찮은 책 있으면 추천해주세요. 얇고 깊이 있는 책이면 좋겠습니다. :) 
자바 경력 대략 12년차이니 프로그래밍 기본적인 것보다 핵심라이브러리,프레임웍,OS관련 내용이 있으면 좋겠습니다.

블로그 방문하시는분들께 도움 부탁드립니다.
감사합니다.

저작자 표시
신고

'프로그래밍 > C# & .NET' 카테고리의 다른 글

CLR 메모리 구조 (노트)  (0) 2010.05.12
자바개발자가 본 .NET 프레임웍  (0) 2010.05.11
ApplicationDomain  (0) 2010.05.11
Microsoft Sync Framework (MSF)  (1) 2010.05.10
ildasm (C# 디컴파일러)  (3) 2010.05.10
C# 책 추천 부탁합니다.  (4) 2010.05.06
TAG .NET, C#