WebMethod 특성 사용

2007. 12. 14. 17:21 개발언어/ASP.NET
http://msdn.microsoft.com/library/kor/default.asp?url=/library/KOR/vbcon/html/vbtskusingwebmethodattribute.asp

 

Visual Basic 및 Visual C# 개념  

WebMethod 특성 사용

WebMethod 특성을 Public 메서드에 연결하는 것은 해당 메서드가 XML Web services의 일부로 노출되게 하려는 것을 나타냅니다. 또한 이 특성의 속성을 사용하여 XML Web services 메서드의 동작을 좀 더 자세하게 구성할 수 있습니다. 자세한 내용은 관리되는 코드의 XML Web services를 위한 코드 모델을 참조하십시오.

WebMethod 특성에는 다음과 같은 속성이 있습니다.

BufferResponse

WebMethod 특성의 BufferResponse 속성을 사용하면 XML Web services 메서드에 대한 응답을 버퍼링할 수 있습니다. 기본 설정인 true로 설정하면 ASP.NET에서 클라이언트로 응답을 보내기 전에 전체 응답을 버퍼링합니다. 버퍼링은 매우 효율적인 방법으로서 작업자 프로세스와 IIS 프로세스 간의 통신을 최소화하여 성능을 높이는 역할을 합니다. 이 속성을 false로 설정하면 ASP.NET에서 16KB의 청크에 응답을 버퍼링합니다. 대개 메모리에 있는 전체 응답 내용을 한 번에 보내지 않으려는 경우에만 이 속성을 false로 설정합니다. 예를 들어, 데이터베이스에서 항목을 스트리밍하고 있는 컬렉션에 응답을 보내는 경우가 있습니다. 별도로 지정하지 않으면 기본값은 true입니다. 자세한 내용은 WebMethodAttribute.BufferResponse 속성을 참조하십시오.

XML Web services 메서드의 응답을 버퍼링하려면

  • WebMethod 특성의 BufferResponse 속성을 다음과 같이 사용합니다.
    ' Visual Basic
    Public Class Service1
        Inherits System.Web.Services.WebService
        <System.Web.Services.WebMethod(BufferResponse:=False)> _
        Public Function GetBigData() As DataSet
            'implementation code
        End Function
    End Class
    
    // C#
    public class Service1 : System.Web.Services.WebService
    { 
        [System.Web.Services.WebMethod(BufferResponse=false)]
        public DataSet GetBigData()
        {
           //implementation code
        }
    }

CacheDuration

WebMethod 특성의 CacheDuration 속성을 사용하면 XML Web services 메서드의 결과를 캐싱할 수 있습니다. ASP.NET에서는 고유한 각 매개 변수 집합에 대해 결과를 캐싱합니다. 이 속성의 값은 ASP.NET에서 결과를 몇 초 동안 캐싱하는지 지정합니다. 값을 0으로 설정하면 결과가 캐싱되지 않습니다. 별도로 지정하지 않으면 기본값은 0입니다. 자세한 내용은 WebMethodAttribute.CacheDuration 속성을 참조하십시오.

XML Web services 메서드의 결과를 캐싱하려면

  • WebMethod 특성의 CacheDuration 속성을 다음과 같이 사용합니다.
    ' Visual Basic
    Public Class Service1
        Inherits System.Web.Services.WebService
        <System.Web.Services.WebMethod(CacheDuration:=60)> _
        Public Function ConvertTemperature(ByVal dFahrenheit As Double) _
                                           As Double
            ConvertTemperature = ((dFahrenheit - 32) * 5) / 9
        End Function
    End Class
    
    // C#
    public class Service1 : System.Web.Services.WebService
    { 
        [System.Web.Services.WebMethod(CacheDuration=60)]
        public double ConvertTemperature(double dFahrenheit)
        {
           return ((dFahrenheit - 32) * 5) / 9;
        }
    }

Description

WebMethod 특성의 Description 속성은 서비스 도움말 페이지에 표시되는 XML Web services 메서드에 대한 설명을 제공합니다. 별도로 지정하지 않으면 기본값은 빈 문자열입니다. 자세한 내용은 WebMethodAttribute.Description 속성을 참조하십시오.

XML Web services 메서드에 대한 설명을 제공하려면

  • WebMethod 특성의 Description 속성을 다음과 같이 사용합니다.
    ' Visual Basic
    Public Class Service1
        Inherits System.Web.Services.WebService
        <System.Web.Services.WebMethod( _
           Description:="This method converts a temperature " & _
           "in degrees Fahrenheit to a temperature in degrees Celsius.")> _
        Public Function ConvertTemperature(ByVal dFahrenheit As Double) _
                                           As Double
            ConvertTemperature = ((dFahrenheit - 32) * 5) / 9
        End Function
    End Class
    
    // C#
    public class Service1 : System.Web.Services.WebService
    { 
        [System.Web.Services.WebMethod(
           Description="Converts F to C a temperature in " +
           "degrees Fahrenheit to a temperature in degrees Celsius.")]
        public double ConvertTemperature(double dFahrenheit)
        {
           return ((dFahrenheit - 32) * 5) / 9;
        }
    }

EnableSession

WebMethod 특성의 EnableSession 속성을 통해 XML Web services 메서드에 대한 세션 상태를 사용할 수 있습니다. 세션 상태를 사용할 수 있게 되면 XML Web services는 HttpContext.Current.Session에서 세션 상태 컬렉션을 직접 액세스할 수 있습니다. 또는 WebService 기본 클래스에서 상속된 XML Web services인 경우에는 WebService.Session 속성을 사용하여 액세스할 수 있습니다. 별도로 지정하지 않으면 기본값은 false입니다. 자세한 내용은 WebMethodAttribute.EnableSession 속성을 참조하십시오.

XML Web services 메서드에서 세션 상태를 사용할 수 있게 하려면

  • WebMethod 특성의 EnableSession 속성을 다음과 같이 사용합니다.
    ' Visual Basic
    Public Class Service1
        Inherits System.Web.Services.WebService
        <System.Web.Services.WebMethod(EnableSession:=True)> _
        Public Function ConvertTemperature(ByVal dFahrenheit As Double) _
                                           As Double
            Session("Conversions") = Session("Conversions") + 1
            ConvertTemperature = ((dFahrenheit - 32) * 5) / 9
        End Function
        <System.Web.Services.WebMethod(EnableSession:=True)> _
        Public Function GetNumberOfConversions() As Integer
            GetNumberOfConversions = Session("Conversions")
        End Function
    End Class
    
    // C#
    public class Service1 : System.Web.Services.WebService
    { 
        [System.Web.Services.WebMethod(EnableSession=true)]
        public double ConvertTemperature(double dFahrenheit)
        {
           Session["Conversions"] = (int) Session["Conversions"] + 1;
           return ((dFahrenheit - 32) * 5) / 9;
        }
        [System.Web.Services.WebMethod(EnableSession=true)]
        public int GetNumberOfConversions()
        {
           return (int) Session["Conversions"];
        }
    }

MessageName

WebMethod 특성의 MessageName 속성을 사용하면 XML Web services에서 별칭을 사용하여 오버로드된 메서드를 고유하게 식별할 수 있습니다. 별도로 지정하지 않으면 기본값은 메서드 이름입니다. MessageName을 지정하면 결과 SOAP 메시지에 실제 메서드 이름 대신에 이 이름이 표시됩니다. 자세한 내용은 WebMethodAttribute.MessageName 속성을 참조하십시오.

XML Web services 메서드에 대한 메시지 이름을 제공하려면

  • WebMethod 특성의 MessageName 속성을 다음과 같이 사용합니다.
    ' Visual Basic
    Public Class Service1
        Inherits System.Web.Services.WebService
        <System.Web.Services.WebMethod(MessageName:="AddDoubles")> _
        Public Function Add(ByVal dValueOne As Double, _
                            ByVal dValueTwo As Double) As Double
            Add = dValueOne + dValueTwo
        End Function
        <System.Web.Services.WebMethod(MessageName:="AddIntegers")> _
        Public Function Add(ByVal iValueOne As Integer, _
                            ByVal iValueTwo As Integer) As Integer
            Add = iValueOne + iValueTwo
        End Function
    End Class
    
    // C#
    public class Service1 : System.Web.Services.WebService
    { 
        [System.Web.Services.WebMethod(MessageName="AddDoubles")]
        public double Add(double dValueOne, double dValueTwo)
        {
           return dValueOne + dValueTwo;
        }
        [System.Web.Services.WebMethod(MessageName="AddIntegers")]
        public int Add(int iValueOne, int iValueTwo)
        {
           return iValueOne + iValueTwo;
        }
    }

    double 값을 추가하는 AddDoubles 메서드에 대한 SOAP 요청 메시지는 다음과 같습니다.

    POST /myWebService/Service1.asmx HTTP/1.1
    Host: localhost
    Content-Type: text/xml; charset=utf-8
    Content-Length: length
    SOAPAction: "http://tempuri.org/AddDoubles"
    
    <?xml version="1.0" encoding="utf-8"?>
    <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:xsd="http://www.w3.org/2001/XMLSchema"
     xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
      <soap:Body>
        <AddDoubles xmlns="http://tempuri.org/">
          <dValueOne>double</dValueOne>
          <dValueTwo>double</dValueTwo>
        </AddDoubles>
      </soap:Body>
    </soap:Envelope>
    HTTP/1.1 200 OK
    Content-Type: text/xml; charset=utf-8
    Content-Length: length

    double 값을 추가하는 AddDoubles 메서드에 대한 SOAP 응답 메시지는 다음과 같습니다.

    <?xml version="1.0" encoding="utf-8"?>
    <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:xsd="http://www.w3.org/2001/XMLSchema"
     xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
      <soap:Body>
        <AddDoublesResponse xmlns="http://tempuri.org/">
          <AddDoublesResult>double</AddDoublesResult>
        </AddDoublesResponse>
      </soap:Body>
    </soap:Envelope>

TransactionOption

WebMethod 특성의 TransactionOption 속성을 사용하면 XML Web services 메서드가 트랜잭션의 루트 개체로 참여할 수 있습니다. TransactionOption 속성을 TransactionOption 열거형의 값으로 설정할 수 있어도 XML Web services 메서드에서 가능한 동작은 두 가지 뿐입니다. 즉, Disabled, NotSupported, Supported의 경우 메서드가 트랜잭션에 참여하지 않으며, Required, RequiresNew의 경우는 새 트랜잭션을 만듭니다. 별도로 지정하지 않으면 기본값은 TransactionOption.Disabled입니다. 자세한 내용은 WebMethodAttribute.TransactionOption 속성을 참조하십시오.

XML Web services 메서드에 대한 사전 요구 사항 외에도 System.EnterpriseServices.dll에 참조를 추가해야 합니다. 이 네임스페이스에는 COM+ 서비스에서 볼 수 있는 분산 트랜잭션 모델을 노출하는 메서드와 속성이 들어 있습니다. System.EnterpriseServices.ContextUtil 클래스를 사용하면 SetAbort 또는 SetComplete 메서드를 사용하여 트랜잭션을 처리할 수 있습니다. 자세한 내용은 ASP.NET을 사용하여 만든 XML Web services의 트랜잭션에 참여자동 트랜잭션 및 XML Web services를 참조하십시오.

XML Web services 메서드로 새 트랜잭션을 만들려면

  1. System.EnterpriseServices.dll에 대한 참조를 추가합니다. 자세한 내용은 참조 추가 및 제거를 참조하십시오.
  2. 아래와 같이 XML Web services에 System.EnterpriseServices 네임스페이스를 추가합니다.
    ' Visual Basic
    Imports System.EnterpriseServices
    
    // C#
    using System.EnterpriseServices;
  3. WebMethod 특성의 TransactionOption 속성을 다음과 같이 사용합니다.
    ' Visual Basic
    Public Class Service1
        Inherits System.Web.Services.WebService
        <System.Web.Services.WebMethod( _
           TransactionOption:=TransactionOption.RequiresNew)> _
        Public Function DoSomethingTransactional() As String
           'The transaction was successful...
           ContextUtil.SetComplete
           DoSomethingTransactional = ContextUtil.TransactionId.ToString()
        End Function
    End Class
    
    // C#
    public class Service1 : System.Web.Services.WebService
    { 
        [System.Web.Services.WebMethod(
           TransactionOption=TransactionOption.RequiresNew)]
        public string DoSomethingTransactional()
        {
           // The transaction was successful...
           ContextUtil.SetComplete();
           return ContextUtil.TransactionId.ToString();
        }
    }

참고 항목