2013. 11. 18. 15:00

왜 그런지는 모르겠지만지만 함수는 '원 리턴(One Return)'이 원칙입니다.(아마도 함수리턴값을 바로 사용하는 기능때문 인것 같네요.)

그래서 여러값을 받고 싶으면 C는 포인터를 이용하고 객체지향언어에서는 클래스(class, 모듈(Model)도 여기에 해당한다.)를 리턴 받는 방법으로 여러값을 받습니다.

 

언어에 따라 '파라메타 아웃풋(Parameter Output)' 같은 것을 지원 할수도 있습니다.

ex> //C#의 경우

public int DataReturn(out string sData)

 

1. WCF는 객체를 리턴 할수 없다.

문제는 WCF는 객체를 리턴 할수 없습니다.

참고 : MSDN 포럼 - How do I pass a WCF class as a reference parameter?

 

WCF 메커니즘을 보면 알수 있다는데.....전 봐도 모르겠네요-_-;

어찌됬건 테스트 코드를 만들어봐도 알지만 클래스가 전달이 되지 않습니다.

 

 

2. WCF는 Parameter Output를 할수 없다.

WCF구조상 그런건지 모르겠지만 파라메타 아웃풋(Parameter Output)을 지원 하지 않습니다.

생각해보니 지원된다면 비동기로는 어떻게 데이터를 받지? ㅎㅎㅎㅎㅎ

 

 

3. WCF에서 여러개의 값을 받기

그러면 WCF에서 여러값을 받으려면 어떻게 해야 할까요?

이것저것 생각하다가 결국 떠오른 방법이.

 

"'DataTable'를 받으면 어떻지?"

 

WCF는 DB를 대신 받아주는 목적으로 많이 사용하기 때문에 'DataTable' 형식을 받을수 있다면 여러개의 값을 리턴받을수 있습니다.

('DataSet', 'DataRow'등도 받을수 있으니까요 ㅋ)

 

 

3-1. DataTable 리턴하기

string로 선언 되있던 리턴을 'DataTable'로 변경하고 테스트를 해 봅시다.

(기존 코드는 '[WCF] WCF 서비스를 클라이언트에서 비동기로 사용하기'를 참고 해주세요.)

 

public DataTable DataGet()
{
	DataTable dtTemp = new DataTable();
	dtTemp.Columns.Add("a");
	dtTemp.Columns.Add("b");

	string[] sss = new string[] { "aaa", "bbb" };

	dtTemp.Rows.Add(sss);

	return dtTemp;
}

 

 

이제 테스트를 해봅시다.

 

사용자 코드에서 TargetInvocationException이(가) 처리되지 않았습니다.

작업을 수행하는 동안 예외가 발생하여 결과가 유효하지 않습니다. 예외에 대한 자세한 내용은 InnerException을 참조 하십시오.

 

 

 

 

 

크헉;;;

 

이게 뭔일이지?

 

 

3-2. DataTable 리턴하기 - 재도전

검색해도 예전에 버그가 있어서 그냥 리턴이 되지 않았다는 말만 있고 별다른 내용이 없습니다;;;;

그러던중 다른 사람이 만들어둔 샘플에서 '테이블 이름(Table Name)'가 명시되있는 것을 확인 했습니다.

(참고 : MSDN 포럼 - Can a WCF Service return a Datatable ??)

 

그래서 코드에서 테이블 명을 명시해 보았습니다.

public DataTable DataGet()
{
	DataTable dtTemp = new DataTable("T1");
	dtTemp.Columns.Add("a");
	dtTemp.Columns.Add("b");

	string[] sss = new string[] { "aaa", "bbb" };

	dtTemp.Rows.Add(sss);

	return dtTemp;
}

 

 

이제 테스트를 해봅시다.

 

 

이제 잘되네요.

 

 

마무리

간만에 WCF하려니 왜이렇게 걸리는게 많은지-_-a

 

여튼 DataSet도 동일하게 처리할 수 있습니다.

DataRow는 안됩니다.