2012. 4. 14.

WCF parameter와 return에 대해 알 수 없는 현상들...

이전 Post에서도 밝혔듯이 최근의 프로젝트는 WCF를 사용하고 있다.

프로젝트 Framework가 Spring.NET이다 보니 WCF의 설정 및 프로그램도 Spring.NET을 최대한 이용하고 있다.

그런 이유인지 모르겠지만, 약간 이상한 현상들이 나타나곤 한다.

최근에 발생한 문제는 Parameter로 받아서 해당 변수를 처리하여 그대로 리턴한 경우인데...

즉 간단히 함수를 보면.

IList<someobject> SetChangeList(IList<someobject> paramList)
{
    foreach(SomeObject item in paramList)
    {
        item.SomeValue = "value";
    }

    return paramList;
}

뭐 이런식의 형태라는 거다.

로컬 컴퓨터에서 해당 클래스의 해당 함수에 대한 모듈 단위테스트는 당연히 성공.

로컬 컴퓨터에서 WCF 메쏘드로 호출하는 단위 테스트도 성공.

Commit 하고 테스트 서버에 배포!!

테스트 서버에서도 모듈의 단위테스트는 성공..

그런데!! WCF 단위 테스트는 실패다.

그런데 정상적으로 무언가 판단할 수 있는 오류도 없다. WCF 로그에도 아무런 내용이 없다.

설상가상 해당 웹서비스는 재기동까지 되어있는 상황이더라는...

서버이벤트에 해당 웹서비스의 Pool이 중지되었다는 오류 메시지와 함께 웹서비스 시작 시 찍도록 한 로그들이 주루륵...

처음부터 위의 코드가 문제가 있다는 걸 안건 아니고, 이런저런 로그를 남기다 보니 저 부분에서 코드를 점프한다.

위 코드가 실행되는 블록은 분명 try, catch 되어있지만, catch 되지도 않는다.

이런저런 처리를 하다가 받은 리스트를 그대로 리턴하지 않도록 아래와 같은 수정을 해보게 됐다.

즉,

IList<SomeObject> SetChangeList(IList<SomeObject> paramList)
{
    IList<SomeObject> returnList = new List<SomeObject>();
    foreach(SomeObject item in paramList)
    {
        item.SomeValue = "value";
        returnList.Add(item);
    }

    return returnList;
}


그랬더니 로컬에서도 테스트 서버에서도 어디에서도 테스트 성공이다.

이유를 정확히 알지 못한 채 WCF에서는 되도록 받은 파라미터를 그대로 쓰지 말자.. 그대로 리턴하지 말자.. 뭐 그런 생각으로 상황 종료...

혹시 아는 사람 좀 알려주면 좋겠다...