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 메서드로 새 트랜잭션을 만들려면
- System.EnterpriseServices.dll에 대한 참조를 추가합니다. 자세한 내용은 참조 추가 및 제거를 참조하십시오.
- 아래와 같이 XML Web services에 System.EnterpriseServices 네임스페이스를 추가합니다.
' Visual Basic Imports System.EnterpriseServices // C# using System.EnterpriseServices;
- 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(); } }