Flash & Asp.net - 4 ; Asp.net & Flash & Web Service!
Asp.net으로 간단한 더하기/빼기 웹 서비스를 구성하고, 그 웹 서비스를 호출하는 Flash 개체를 만드는 예제를 보여드립니다.
안녕하세요 : )
지난 아티클(Flash & Asp.net - 3 : XML 파싱에 Serializer 활용하기)에 예고한대로, 이번 아티클은 Asp.net에서의 웹 서비스를 만드는 것과, 플래시에서 웹 서비스를 이용하는 방법에 대한 간단한 예제를 보여드리도록 하겠습니다.
이 아티클은 VS.net 2003과 Flash MX 2004 환경에서 만들어졌습니다.
편의상 웹 서비스에 대한 설명은 생략하고 진행합니다.
Asp.net ; 더하기 빼기 웹 서비스 만들기
웹 서비스 프로젝트를 만드는 과정은 생략하도록 하겠다. WebService.asmx라는 이름의 웹 서비스 파일을 생성하고, 예전과 같이 더하기와 빼기 연산을 하는 메서드를 다음과 소스와 같이 구현한다 :
[WebMethod]
public int Add(int[] numbers)
{
int sum = 0;
foreach(int number in numbers)
sum += number;
return sum;
}
더하기 기능을 수행하는 메서드
웹 서비스라고 해서 그다지 특별한 것은 없다. 메서드 앞에 웹 서비스용 메서드라는 표시로 WebMethod라는 Attribute를 주는 것으로 끝이다. 소스에 대해서는 자세한 설명이 필요없을 줄로 안다.
파라메터로 int형 배열을 받고 있는데, 이것을 어떻게 전달하는지는 Flash 측 소스에서 보도록 하겠다.
[WebMethod]
public int Subtract(int[] numbers)
{
int minuend = 0;
for(int i=0;i<numbers.GetLength(0);i++)
{
if(i==0)
minuend += numbers[i];
else
minuend -= numbers[i];
}
return minuend;
}
빼기 기능을 수행하는 메서드
로직의 차이일 뿐, 위의 코드와 별 차이는 없다.
[WebMethod]
public string Add_XML(int[] numbers)
{
int sum = 0;
foreach(int number in numbers)
sum += number;
XmlSerializer serializer = new XmlSerializer(typeof(CalculatorMessage));
CalculatorMessage msg = new CalculatorMessage();
StringWriter writer = new StringWriter();
msg.Type = "ResponseAdd";
msg.number = new int[1];
msg.number[0] = sum;
serializer.Serialize(writer, msg);
return writer.ToString();
}
더하기 기능을 수행하는 메서드, 결과를 XML로 리턴한다
이 소스가 이해가 가지 않는 분은, 이전 아티클(Flash & Asp.net - 3 : XML 파싱에 Serializer 활용하기)을 참고하기 바란다. 물론 프로젝트에는 예전에 작성했던 CalculatorMessage 클래스가 포함되어 있어야 한다.
[WebMethod]
public string Subtract_XML(int[] numbers)
{
int minuend = 0;
for(int i=0;i<numbers.GetLength(0);i++)
{
if(i==0)
minuend += numbers[i];
else
minuend -= numbers[i];
}
XmlSerializer serializer = new XmlSerializer(typeof(CalculatorMessage));
CalculatorMessage msg = new CalculatorMessage();
StringWriter writer = new StringWriter();
msg.Type = "ResponseSubtract";
msg.number = new int[1];
msg.number[0] = minuend;
serializer.Serialize(writer, msg);
return writer.ToString();
}
빼기 기능을 수행하는 메서드, 결과를 XML로 리턴한다
그리고 테스트를 위해 하나의 메서드를 더 생성하도록 하자 :
[WebMethod]
public string Echo(string strText)
{
return string.Format("Echo:{0}",strText);
}
Echo 메서드
파라메터로 들어온 문자열을 'Echo:' 와 함께 리턴해주는 메서드이다.
코드를 모두 입력하고 정상적으로 컴파일했다면, 브라우저에서 결과를 보도록 하자 :
웹 서비스의 전체 목록, Echo를 클릭해보자
Echo 메서드에 대한 설명
파라메터에 'test string'을 넣고 호출해보자 :
Echo 메서드의 호출 결과
참고로, 웹 서비스에 대한 테스트는 웹 서비스가 존재하는 웹 서버 로컬에서만 실행할 수 있다.
Flash ; WebServiceConnector
Flash MX 2004 (프로페셔널 버전 이상)에서는 플래시에서 데이터 액세스의 확장을 위해 여러가지 데이터 관련 컴퍼넌트를 제공하고 있다. WebServiceConnector는 그 컴퍼넌트 중 하나로, 웹 서비스에 대한 액세스를 지원하기 위해 디자인되었다.
그럼 이제 Asp.net으로 만들어진 웹 서비스를 플래시에서 사용해보도록 하자. 테스트를 위해 플래시에서 다음과 같은 폼을 만든다 :
다 섯개의 Button 컴퍼넌트, 하나의 TextArea(Instance Name은 txtResult로 한다), 그리고 오른쪽 밑에 있는 것이 WebServiceConnector이다. (Components 탭의 Data Components 그룹에 있다) Instance Name은 wsc로 한다. 그리고 각각의 컴퍼넌트에 ActionScript 코드를 넣자 :
on(click)
{
_root.wsc.WSDLURL = "http://localhost/flashtest/WebService.asmx?WSDL";
_root.wsc.operation = "Add";
_root.wsc.params = [new Array(1,2,3,4)];
_root.wsc.trigger();
}
첫번째 '더하기' 버튼
on(click)
{
_root.wsc.WSDLURL = "http://localhost/flashtest/WebService.asmx?WSDL";
_root.wsc.operation = "Subtract";
_root.wsc.params = [new Array(1,2,3,4)];
_root.wsc.trigger();
}
두번째 '빼기' 버튼
on(click)
{
_root.wsc.WSDLURL = "http://localhost/flashtest/WebService.asmx?WSDL";
_root.wsc.operation = "Add_XML";
_root.wsc.params = [new Array(1,2,3,4)];
_root.wsc.trigger();
}
세번째 '더하기' 버튼
on(click)
{
_root.wsc.WSDLURL = "http://localhost/flashtest/WebService.asmx?WSDL";
_root.wsc.operation = "Subtract_XML";
_root.wsc.params = [new Array(1,2,3,4)];
_root.wsc.trigger();
}
네번째 '빼기' 버튼
on(click)
{
_root.wsc.WSDLURL = "http://localhost/flashtest/WebService.asmx?WSDL";
_root.wsc.operation = "Echo";
_root.wsc.params = ['temp'];
_root.wsc.trigger();
}
다섯번째 'Echo' 버튼
사 실 특별한 코드는 없다. URL을 알려주고, 메서드의 이름을 operation 속성에 넣고, 파라메터를 params 속성에 넣고 trigger()로 웹 서비스 요청을 전송하면 된다. (URL의 경우, 서비스의 페이지가 아니라 WSDL(Web Service Definition Language) 페이지의 주소를 입력해야 된다는 것을 혼동하지 않도록 하자)
다만 특이한 점은 params 속성의 값을 넣을 때 []로 감싸고 있는데, WebServiceConnector는 기본적으로 메서드의 파라메터를 Array로 처리하고 있다. 이는 메서드에 여러 개의 파라메터 값이 넘어올 때를 대비한 디자인으로, 파라메터 값이 하나이더라도 저렇게 []로 감싸줘야 Array로 인식을 해서 제대로 처리되게 된다.
다른 방법으로, 마지막 Echo 메서드의 경우 이런 식으로 코딩할 수도 있다. 편한 쪽을 선택하면 된다 :
on(click)
{
_root.wsc.WSDLURL = "http://localhost/flashtest/WebService.asmx?WSDL";
_root.wsc.operation = "Echo";
var tmp_param:Array = new Array();
tmp_param[0] = 'temp';
_root.wsc.params = tmp_param;
_root.wsc.trigger();
}
변경된 다섯번째 'Echo' 버튼의 스크립트
그리고 마지막으로, WebServiceConnector의 코드이다 :
on(result) {
_root.txtResult.text = _root.wsc.results;
}
wsc ; WebServiceConnector 개체
일 단 코드는 너무나 간단하다. 하지만 이쯤에서 Flash의 ActionScript에 익숙지 않은 사람은 이런 의문이 생길 수 있을 것이다 : '왜 꼭 이렇게 처리해야만 하나? trigger()를 호출한 후 곧바로 결과 값을 받아올 수는 없는 것인가?'
이 것을 설명하기 위해서는 먼저 ActionScript에 대한 이해가 선행되어야 하겠지만, 최대한 간단히 설명하도록 하겠다 : ActionScript는 Block되는 명령을 지원하지 않는다. C#에서 프로그램의 실행을 잠시 멈추고 다른 스레드에 cpu를 넘겨주는 System.Threading.Thread.Sleep() 같은 함수도 없으며, 기본적인 모든 개체의 명령은 비동기로 처리된다. 위 코드에서 trigger()를 호출한 후, 프로그램의 제어는 곧바로 그 다음 행으로 넘어가며, 그 상태에서는 아직 웹 서비스의 결과가 리턴되지 않은 상태인 것이다. 이런 구조는 Data-Driven을 지향하는 ActionScript의 철학에 따른 것이며, 보다 자세한 것은 ActionScript 관련 서적을 참고하길 바란다.
모든 코딩이 완료되었다면, 결과를 보도록 하자 :
첫번째 Add 버튼을 클릭했을 때
두번째 Subtract 버튼을 클릭했을 때
세번째 Add 버튼을 클릭했을 때
네번째 Subtract 버튼을 클릭했을 때
다섯번째 Echo 버튼을 클릭했을 때
위와 같이 웹 서비스로부터 결과를 받아올 수 있게 된다.
정리
간 단하게나마, Asp.net에서의 웹 서비스 코드 작성과 Flash에서의 WebServiceConnector 관련 작업을 소개해 보았습니다. 이 아티클을 보시면서, 사실 웹 서비스 관련 핵심 코드 자체는 정말 '어이없이 간단한' 코드라는 것을 알게 되셨을겁니다.
이제 어떤 개발 툴이건, 어떤 개발 환경이건 웹 서비스에 대한 지원은 쉽고 간단한 형태로 나오고 있는 만큼, 개발자에게 필요한 것은 (내부 디자인에 대한 통찰력도 중요하지만) '이 도구로 무엇을 만들 것인가'가 아닌가 싶습니다.
그럼 : )
'TechLog' 카테고리의 다른 글
닷넷 프레임워크의 스트림 이해하기 (0) | 2008.10.31 |
---|---|
윈도우 서버 제품군(2003, 2008 등)에 msn 메신저 설치 (0) | 2008.10.25 |
Flash & Asp.net - 3 : XML 파싱에 Serializer 활용하기 (0) | 2008.10.23 |
Flash & Asp.net - 2 : Flash 개체와 XML 데이터 연동하기 (0) | 2008.10.22 |
Flash & Asp.net - 1 : Form 전송으로 Flash 개체와 통신하기 (0) | 2008.10.21 |