방법: WebMethod 특성 사용
업데이트: 2007년 11월
WebMethod 특성을 Public 메서드에 연결하는 것은 해당 메서드가 XML Web services의 일부로 노출되게 하려는 것을 나타냅니다. 또한 이 특성의 속성을 사용하여 XML Web services 메서드의 동작을 좀 더 자세하게 구성할 수 있습니다. 자세한 내용은 관리 코드의 XML Web services를 위한 코드 모델을 참조하십시오.
WebMethod 특성에는 다음과 같은 속성이 있습니다.
BufferResponse
CacheDuration
설명
EnableSession
MessageName
TransactionOption
BufferResponse
WebMethod 특성의 BufferResponse 속성을 사용하면 XML Web services 메서드에 대한 응답을 버퍼링할 수 있습니다. 기본 설정인 true로 설정하면 ASP.NET에서 클라이언트로 응답을 보내기 전에 전체 응답을 버퍼링합니다. 버퍼링은 매우 효율적인 방법으로서 작업자 프로세스와 IIS 프로세스 간의 통신을 최소화하여 성능을 높이는 역할을 합니다. 이 속성을 false로 설정하면 ASP.NET에서 16KB의 청크에 응답을 버퍼링합니다. 대개 메모리에 있는 전체 응답 내용을 한 번에 보내지 않으려는 경우에만 이 속성을 false로 설정합니다. 예를 들어, 데이터베이스에서 항목을 스트리밍하고 있는 컬렉션에 응답을 보내는 경우가 있습니다. 별도로 지정하지 않으면 기본값은 true입니다. 자세한 내용은 WebMethodAttribute.BufferResponse 속성을 참조하십시오.
XML Web services 메서드의 응답을 버퍼링하려면
WebMethod 특성의 BufferResponse 속성을 다음과 같이 사용합니다.
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
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 속성을 다음과 같이 사용합니다.
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
public class Service1 : System.Web.Services.WebService { [System.Web.Services.WebMethod(CacheDuration=60)] public double ConvertTemperature(double dFahrenheit) { return ((dFahrenheit - 32) * 5) / 9; } }
설명
WebMethod 특성의 Description 속성은 서비스 도움말 페이지에 표시되는 XML Web services 메서드에 대한 설명을 제공합니다. 별도로 지정하지 않으면 기본값은 빈 문자열입니다. 자세한 내용은 WebMethodAttribute.Description 속성을 참조하십시오.
XML Web services 메서드에 대한 설명을 제공하려면
WebMethod 특성의 Description 속성을 다음과 같이 사용합니다.
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
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 속성을 다음과 같이 사용합니다.
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
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 속성을 다음과 같이 사용합니다.
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
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="https://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="https://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 메서드로 새 트랜잭션을 만들려면
System.EnterpriseServices.dll에 대한 참조를 추가합니다. 자세한 내용은 참조 추가 및 제거를 참조하십시오.
아래와 같이 XML Web services에 System.EnterpriseServices 네임스페이스를 추가합니다.
Imports System.EnterpriseServices
using System.EnterpriseServices;
WebMethod 특성의 TransactionOption 속성을 다음과 같이 사용합니다.
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
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(); } }