WCF 를 이용한 통신채널을 구성할때, 일반적인 방법으로 인터페이스를 선언하고 웹 참조 혹은 DLL 참조, Svcutil 로 생성된 레퍼런스 정보를 사용할 때는 별 문제가 없다. 하지만 WCF 3.5 부터 제공되기 시작한 REST 형태의 호출 지원을 사용하는 경우에는 파라메터의 데이터 형태에 따라 BodyStyle 속성을 지정해야 하는 경우가 빈번하다.

예> IService.cs

[ServiceContract]

public interface IService

{

    [OperationContract]

    [WebInvoke(UriTemplate = "Counter", Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped)]

    int Counter(CounterList counterValues, int tryCount); 

 
그런데 문제는 서비스의 인터페이스 선언에 이렇게 WebInvoke Attirbute 와 BodyStyle 을 지정했음에도 클라이언트에서 서비스를 호출할 때 BodyStyle 이 Wrapped 로 지정되지 않았다는 에러가 발생할 때가 간혹 있다는 점이다. 특히 svcutil 을 이용해서 매뉴얼하게 레퍼런스 클래스를 만드는 경우에 이런 일이 많이 발생한다. (웹참조로 추가하는 경우에도 발생한다는 보고가 있다)

예> 클라이어트에서 서비스 호출시 에러 메세지

'IService' 계약의 'Counter' 작업에서 래퍼 요소 없이 직렬화할 여러 개의 요청 본문 매개 변수를 지정합니다. 최대 하나의 본문 매개 변수가 래퍼 요소 없이 직렬화될 수 있습니다. 추가 본문 매개 변수를 제거하거나 WebGetAttribute/WebInvokeAttribute의 BodyStyle 속성을 Wrapped로 설정하십시오.


이런 경우 서비스쪽을 자꾸 살피게 되는데 원인은 서비스가 아니라 레퍼런스 클래스의 생성에 있기 때문에 트러블슈팅이 쉽지 않다. svcutil 명령을 이용해서 만든 레퍼런스 클래스를 확인해 보면 WebInvoke 로 지정한 내용이 전혀 들어가있지 않은 걸 쉽게 발견할 수 있다. 해당 부분에 동일한 선언을 추가해주면 에러를 가볍게 제거할 수 있다.

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]

[System.ServiceModel.ServiceContractAttribute(ConfigurationName="IService")]

public interface IService

{

[System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IService/Counter", ReplyAction="http://tempuri.org/IService/CounterResponse")]

    [WebInvoke(UriTemplate = "Counter", Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped)]

    int Counter(Counters counterValues, int tryCount);


비동기 형태로 호출하기 위해 만든 레퍼런스 클래스의 경우에도 Beginxxx 와 같은 비동기 메소드를 선언하는 부분에는 지정해줄 필요가 없다. 원래 함수의 속성으로만 지정하면 문제는 해결된다. 혹시 비슷한 어려움을 겪는 사람들을 위해서 공유해둔다.

- NoPD -



 

 
신고
Posted by 노피디
Development2010.12.03 08:53
윈도폰7은 기존 마이크로소프트의 윈도우모바일 계열 운영체제와 다르게 닷넷 기반의 C# 만으로 개발이 가능하다고 알려져 있습니다. Managed 코드로만 개발을 가능하게 함으로써 애플리케이션과 운영체제의 안정성을 더 높히겠다는 마이크로소프트의 의지가 반영된 결과입니다. 한동안 Native C 를 지원하지 않음으로서 생기는 단점들에 대하여 갑론을박이 많았습니다만 단말 런칭 이후에는 이런 이야기가 많이 줄어든 분위기입니다.

마이크로소프트는 여기에 더하여 개발자 저변을 확대하기 위하여 비주얼베이직으로도 개발이 가능한 개발도구 추가 기능을 공개했습니다. 기존에 설치한 비주얼스튜디오 2010 윈도폰 버전이나 윈도폰7 개발도구가 추가된 비주얼스튜디오에 설치 가능하며 아직 정식 버전이 아닌 RTW 임을 감안하여 테스트 해볼것을 권장하고 있습니다. 비주얼 베이직은 은근히 개발자 층이 넓다는 것이 이번 개발도구 런칭의 이유가 아닐까 싶습니다.


개발도구를 다운로드 받는 MSDN 경로는 위의 이미지에 연결해 두었습니다. 이로써 윈도폰7을 개발할 수 있는 닷넷 기반의 Managed 언어는 C# 과 VB 가 된 것 같습니다. 다만 현재까지 XNA 기반의 게임 개발에는 사용할 수 없고 실버라이트를 기반으로하는 일반 어플리케이션 개발로 한정된다고 합니다. 

- NoPD -
신고
Posted by 노피디
Development2010.10.14 07:47
오랜만에 포스팅을 올립니다 :-)
마이크로소프트가 제공하는 윈도우폰7 트레이닝 세션을 보기 시작했습니다.
시작하면서 세션 발표자들께서 좋은 링크들을 많이 공유해 주시네요

아무리 윈도우폰7이 실버라이트와 블렌드를 잘 써야한다고 해도
그 기저에는 C# 이 있다는 것을 부인할 사람은 아무도 없습니다.
본격적으로 윈도우폰7 개발을 공부하기 전에 C# 을 정리해보는 것은
상당히 의미있는 시간이 될 것으로 생각되네요!


위 웹사이트에서 C# Yellow Book 이라는 컨텐츠를 무료 배포하고 있습니다.
잘 아시는 분들도 Remind 하시는 차원에서 한번쯤 보시면 좋을 것 같네요!
귀차니즘을 극복하시려면 아래 링크로 책을 받으시면 됩니다 :-)


- NoPD -
신고
Posted by 노피디
C# 3.0 에서 새롭게 도입된 Lambda 표현식을 사용하면 코드를 정말 간단하게 표시할 수 있는 장점이 있습니다. 델리게이트가 세상에 처음 나타난 이래 이는 정말 많은 프로그램과 개발자들에게 형언할 수 없는 아름다운 생활을 할 수 있는 "기회"를 주었습니다. 물론... 기회에는 반대급부가 따랐지만 말이죠.. 쿨럭... 여튼... 아래의 간단한 세가지 코드를 보면서 코드가 아름다워지는 광경을 한번 보도록 하겠습니다.

Named 메서드의 사용
IEnumerable<string> filteredList = cities.Where(StartsWithL);

public bool StartsWithL(string name)
{
    return name.StartsWith("L");
}

자주 보시던 스타일의 코드입니다. cities 어레이에 들어 있는 값들 중 L 로 시작하는 값을 얻어오는 코드지요. string 클래스의 확장 메서드인 Where 의 도움을 받아 StartsWithL 메서드가 Where 절의 역할을 하고 있습니다.

익명 Delegate의 사용

별도로 메서드를 만들어서 호출하는 것도 나쁘지 않습니다만 이왕이면 코드를 간결하게 유지하기 위해 익명 Delegate를 많이들 사용하실 겁니다. Named 메서드 사용하던걸 익명 Delegate 로 바꿔보겠습니다.

IEnumerable<string> filteredList = cities.Where(
            delegate(string s)
            {
                return s.StartsWith("L");
            }
일단 메서드가 하나 줄어서 기분이 좋습니다 ^^; 익명 Delegate 를 이용해서 위처럼 간단하게 inline 으로 처리를 할 수 있습니다. 그런데 코드가 지저분한 것이 별로 보기가 좋지 않습니다. 이를 람다 표현식으로 바꾸어 보도록 하겠습니다

Lambda 표현식의 사용

IEnumerable<string> filteredList = cities.Where(s => s.StartsWith("L"));
아주 깔끔하게 한줄러 코드를 줄였습니다. 닷넷이 제공하는 컴파일러는 생각보다 똑똑해서 s 라는 변수가 당연히 cities의 타입을 따라간다는 것을 알고 있습니다. 인텔리센스도 실시간으로 당연히 잘 동작하겠지요.

- NoPD -
신고
Posted by 노피디
윈도우 모바일 계열의 단말기 제조에서 타의 추종을 불허하는 HTC. 이미 발매된 단말기들 뿐만 아니라 앞으로 발매될 단말기들도 늘 새로움으로 시장에 즐거움을 주고 있습니다. 특히나 HTC의 윈도우 모바일 기반 단말기들은 Shell 프로그램 자체도 상당히 완성도가 높아서 XDA 등의 개발자 네트워크에서는 새로운 쉘을 다른 단말기에 포팅하는 사례가 많이 올라오고 있지요.

오늘은 HTC 의 HD2 단말기에서 멀티터치 관련 API 가 발견되었다는 소식을 전해드립니다. 윈도우 모바일은 아직까지 멀티터치 기능이 지원되지 않는 것으로 알려져 있었는데, 공식 Release 되지 않은 Registry 영역에 대한 작업을 통해 멀티터치를 구현할 수 있다고 합니다. XDA-Developers 에 올라온 동영상을 감상해 보시겠습니다.





개발자가 직접 간단한 에제 샘플까지 올려두었으니, 한번 테스트 해보실 분들은 도전해 보시는 것도 괜찮을 것 같습니다. 해당 레지스트리 영역이 HTC 단말에만 있는 것인지 윈도우 모바일 6.5 OS 이미지 상에 HTC의 Shell 을 올리는 경우 생기는 것인지는 한번 확인해 봐야겠습니다.

http://forum.xda-developers.com/showpost.php?p=5042917&postcount=1

- NoPD -

신고
Posted by 노피디
사용자 삽입 이미지
개인적인 실험 프로젝트로 me2day 관련 매쉬업 서비스를 개발하다가 기존에 공개된 C# 버전의 닷넷 미투데이 OpenAPI 라이브러리를 업데이트 했습니다. 큰 변경을 가한 것은 아니지만, 기존에 공개된 라이브러리에 빠져있는 메소드와 필드를 추가해서 보다 다양한 활용이 가능하도록 변경해 봤습니다.

me2api 스프링노트에 원저작자가 기술되어 있지 않아서 일단 허락을 받지 않고 배포를 합니다만, 모든 코드의 저작권은 미투데이(http://www.me2day.net)가 가지고 있으며 문제가 될 경우 배포를 중단하도록 하겠습니다. 소스코드는 VIsual Studio 2008 로 컴파일 되어 있어 코드를 수정하실 분들은 사용하시는 VS 버전에 맞추셔야 합니다.

그 외 일반적으로 사용하실 분들은 첨부파일의 Release 폴더에서 DLL 을 참고하셔서 사용하시면 됩니다. 표준 me2day API 의 룰을 따르므로 자세한 메소드별 사용법은 첨부파일의 프로젝트에 같이 포함된 샘플을 참고하시기 바립니다.

This is redistribution of OpenAPI library for micro blogging service named `me2DAY` which is familiar in South Korea. Attached project file has been built under Visual Studio 2008 environment. So if you want to use previous version of Visual Studio IDE, you should migrate it.

All rights are reserved and me2DAY.net has authorities for this library. If this distribution has any problem, I will stop to distribute it. To get API definition document, kindly go to the me2API SpringNote page linked below.

Thanks.

* me2API 스프링노트 : http://codian.springnote.com
* me2day OpenAPI 닷넷 라이브러리 :

- NoPD -
신고
Posted by 노피디

티스토리 툴바