2010.12.14 19:34

C# 사용자 정의 클래스를 이용한 웹 서비스 구현

웹 서비스를 구현하다 보면 사용자 정의 클래스를 이용해 웹 서비스 통신해야 하는 경우 또는 하고 싶은(?) 경우가 있다. 이 경우에는 한가지만 제외하면 굉장히 간단하다.

사용자 정의 클래스를 이용한 웹 서비스 구현 과정은 다음과 같다.
1. 웹 서비스 통신에서 사용할 사용자의 정의 클래스 구현
2. 웹 서비스에 사용자 정의 클래스 참조 추가
3. 사용자 정의 클래스를 이용하는 웹 서비스 메소드 구현
4. 웹 서비스 호출 측에서 통신에서 사용할 사용자 정의 클래스 참조 추가
5. 웹 서비스 호출 측에 웹 서비스 참조 추가
6. 웹 서비스 참조 수정

1. 웹 서비스 통신서 사용할 사용자 정의 클래스 구현
아래와 같이 클래스 라이브러리 형태의 프로젝트를 생성하고 사용자 정의 클래스를 구현한다.

namespace UserLibrary
{
    public class User
    {
        private string userName;

        private string userPassword;

        public User()
        {
        }

        public User(string userName, string userPassword)
        {
            this.userName = userName;
            this.userPassword = userPassword;
        }

        public string UserName
        {
            get { return userName; }
            set { userName = value; }
        }

        public string UserPassword
        {
            get { return userPassword; }
            set { userPassword = value; }
        }
    }
}


2. 웹 서비스에 사용자 정의 클래스 참조 추가
새로운 프로젝트를 웹 서비스 형태로 생성하고 프로젝트에 사용자 정의 클래스가 구현된 프로젝트를 참조로 추가한다.




3. 사용자 정의 클래스를 이용하는 웹 서비스 메소드 구현
아래와 같이 사용자 정의 클래스를 이용하는 메소드를 구현한다.
[WebMethod]
        public User GetNewUser(User user)
        {
            user.UserName = "New " + user.UserName;
            user.UserPassword = "New " + user.UserPassword;

            return user;
        }


4. 웹 서비스 호출 측에서 통신에서 사용할 사용자 정의 클래스 참조 추가
웹 서비스를 호출하는 쪽에서도 동일한 사용자 정의 클래스를 가져와서 참조로 추가를 한다.

5. 웹 서비스 호출 측에 웹 서비스 참조 추가
프로젝트 선택 → 서비스 참조 추가 → 팝업창에서 좌측 아래 [고급] → 좌측 아래 [웹 참조 추가]글 선택하면 아래와 같은 화면이 뜨고 URL을 입력하고 이동을 클릭하면 호출할 수 있는 웹 서비스가 뜬다. 여기에서 [참조 추가]를 하면 정상적으로 웹 서비스가 등록된다.



6. 웹 서비스 참조 수정
자~ 그럼 웹 서비스 메소드를 호출해보자. 아래와 같이 웹 서비스를 호출하는 측에서 사용자 정의 객체를 이용해서 웹 서비스를 호출해보자.

static void Main(string[] args)
        {
            localhost.Service1 ws = new WebServiceCaller.localhost.Service1();
            UserLibrary.User user = new UserLibrary.User("test user", "test password");

            Console.WriteLine("웹 서비스 호출 전");
            Console.WriteLine(user.UserName);
            Console.WriteLine(user.UserPassword);
            
            UserLibrary.User newUser = ws.GetNewUser(user);

            Console.WriteLine("웹 서비스 호출 후");
            Console.WriteLine(newUser.UserName);
            Console.WriteLine(newUser.UserPassword);

            Console.ReadLine();
        }

으잉?? 잘못된 인수가 있다는 오류와 변환할 수 없다는 오류가 뜬다.. 제대로 작성했는데..;;;


이유인 즉슨 웹 서비스 참조를 추가하면서 사용자 정의 클래스를 웹 서비스에서 제공하는 클래스로 다시 정의해버린 것이다.

툴바의 [프로젝트] → [모든 파일 표시]를 선택 후 솔류션 탐색기에서 웹 서비스의 Refence.map의 Refecence.cs 파일을 열어보자. 아래와 같이 사용자 정의 클래스가 재정의된 것을 볼 수 있다.


해결책: 재정의된 클래스 부분을 삭제하고(/// <remarks/> 부분부터 삭제해야 됨) 파일 맨위 using문에 우리가 정의한 클래스를 적어주자. 그럼 오류가 없어질 것이다.

namespace WebServiceCaller.localhost {
    using System.Diagnostics;
    using System.Web.Services;
    using System.ComponentModel;
    using System.Web.Services.Protocols;
    using System;
    using System.Xml.Serialization;

    using UserLibrary;

결과: 짜란~ 정상적으로 웹 서비스가 호출된 것을 볼 수 있다.


주의할 점: 웹 서비스를 호출하기 전에 반드시 웹 서비스를 구동 시켜야 한다.


[참조] How to Return a User Defined Object from Webservice
Trackback 0 Comment 0