'웹 서비스'에 해당되는 글 2건

  1. 2012.10.16 C# 실행시간에 웹서비스 참조 추가하기
  2. 2010.12.14 C# 사용자 정의 클래스를 이용한 웹 서비스 구현
2012.10.16 11:11

C# 실행시간에 웹서비스 참조 추가하기

웹서비스 참조 생성에 필요한 클래스
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.Security.Permissions;
using System.Web.Services.Description;

namespace WebServiceCall
{
    internal class WsProxy
    {
        [SecurityPermissionAttribute(SecurityAction.Demand, Unrestricted = true)]

        internal static object CallWebService(string webServiceAsmxUrl, string serviceName, string methodName, object[] args)
        {
            System.Net.WebClient client = new System.Net.WebClient();

            // Connect To the web service
            System.IO.Stream stream = client.OpenRead(webServiceAsmxUrl + "?wsdl");

            // Now read the WSDL file describing a service.
            ServiceDescription description = ServiceDescription.Read(stream);

            ///// LOAD THE DOM /////////
            // Initialize a service description importer.
            ServiceDescriptionImporter importer = new ServiceDescriptionImporter();
            importer.ProtocolName = "Soap12"; // Use SOAP 1.2.
            importer.AddServiceDescription(description, null, null);

            // Generate a proxy client.
            importer.Style = ServiceDescriptionImportStyle.Client;

            // Generate properties to represent primitive values.
            importer.CodeGenerationOptions = System.Xml.Serialization.CodeGenerationOptions.GenerateProperties;

            // Initialize a Code-DOM tree into which we will import the service.
            CodeNamespace nmspace = new CodeNamespace();
            CodeCompileUnit unit1 = new CodeCompileUnit();
            unit1.Namespaces.Add(nmspace);

            // Import the service into the Code-DOM tree. This creates proxy code that uses the service.
            ServiceDescriptionImportWarnings warning = importer.Import(nmspace, unit1);

            if (warning == 0) // If zero then we are good to go
            {

                // Generate the proxy code
                CodeDomProvider provider1 = CodeDomProvider.CreateProvider("CSharp");

                // Compile the assembly proxy with the appropriate references
                string[] assemblyReferences = new string[5] { "System.dll", "System.Web.Services.dll", "System.Web.dll", "System.Xml.dll", "System.Data.dll" };

                CompilerParameters parms = new CompilerParameters(assemblyReferences);

                CompilerResults results = provider1.CompileAssemblyFromDom(parms, unit1);

                // Check For Errors
                if (results.Errors.Count > 0)
                {
                    foreach (CompilerError oops in results.Errors)
                    {
                        System.Diagnostics.Debug.WriteLine("========Compiler error============");
                        System.Diagnostics.Debug.WriteLine(oops.ErrorText);
                    }

                    throw new System.Exception("Compile Error Occured calling webservice. Check Debug ouput window.");
                }

                // Finally, Invoke the web service method
                object wsvcClass = results.CompiledAssembly.CreateInstance(serviceName);

                MethodInfo mi = wsvcClass.GetType().GetMethod(methodName);

                return mi.Invoke(wsvcClass, args);

            }
            else
            {
                return null;
            }
        }
    }
}


웹 서비스 호출

object a = WsProxy.CallWebService("웹서비스 asmx url", "서비스명", "메소드명", new object[]{파라미터들});

[출처] Adding a Web reference dynamically at Runtime


Trackback 0 Comment 0
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