WCF 서비스를 클라이언트 스크립트로 노출

업데이트: 2007년 11월

WCF(Windows Communication Foundation)는 서비스 기반 응용 프로그램을 만드는 데 사용되는 Microsoft의 통합 프로그래밍 모델입니다. 이 모델에서는 ASP.NET AJAX 및 JSON(JavaScript Object Notation) 데이터 형식을 지원합니다. 이 모델을 사용하면 WCF 서비스에서 ECMAScript(JavaScript) 코드를 실행하는 기능을 웹 페이지에 노출할 수 있으므로 HTTP 요청을 사용하여 이러한 서비스에 액세스할 수 있습니다.

WCF 서비스를 이미 만든 경우 AJAX 사용 웹 페이지의 스크립트에서 이 서비스에 액세스하는 데 사용할 수 있는 끝점을 추가할 수 있습니다. 이 항목에서는 브라우저에서 실행되는 JavaScript에서 WCF 서비스를 사용할 수 있는 방법에 대해 설명합니다.

.NET Framework에서는 페이지 부하 시간에 WCF 서비스에 대한 JavaScript 프록시 클래스를 자동으로 만들고 프록시 클래스 스크립트를 브라우저로 다운로드합니다. 이러한 프록시 클래스는 Microsoft AJAX 라이브러리의 Sys.Net.WebServiceProxy 클래스에서 파생됩니다.

사용자는 JavaScript 프록시 클래스의 해당 메서드를 호출하여 WCF 서비스 작업을 호출할 수 있습니다. 자세한 내용은 클라이언트 스크립트에서 웹 서비스 호출을 참조하십시오.

WCF 서비스를 클라이언트 스크립트에서 액세스할 수 있도록 만들기

WCF 서비스를 클라이언트 스크립트에서 사용할 수 있도록 하려면 다음 요구 사항을 충족해야 합니다.

  • 확장명이 .svc인 파일이 포함된 웹 응용 프로그램에서 서비스를 호스팅해야 합니다. 이 파일에는 WCF 서비스를 가리키는 @ ServiceHost 지시문이 들어 있습니다. 다음 예제에서는 @ ServiceHost 지시문을 보여 줍니다.

    <%@ ServiceHost Language=C# Service="Aspnet.Samples.SimpleService" CodeBehind="~/App_Code/SimpleService.cs"%> 
    
    <%@ ServiceHost Language=VB Service="Aspnet.Samples.SimpleService" CodeBehind="~/App_Code/SimpleService.vb"%> 
    
  • 웹 응용 프로그램이 웹 서비스를 스크립트에서 호출하는 것을 지원하도록 구성해야 합니다. 자세한 내용은 방법: ASP.NET AJAX에서 WCF 서비스 구성을 참조하십시오.

  • 서비스는 ServiceContractAttribute로 표시된 인터페이스를 구현하는 클래스여야 합니다. 스크립트에서 호출하는 각 서비스 작업(메서드)은 OperationContractAttribute 특성을 사용하여 한정되어야 합니다.

다음 예제에서는 ServiceContractAttribute로 표시된 인터페이스를 구현하는 클래스를 보여 줍니다.

namespace Samples.Aspnet
{
    [ServiceContract(Namespace="MyServices.org")]
    public interface ISimpleService
    {
        [OperationContract]
        string HelloWorld1(string value1);
        [OperationContract]
        string HelloWorld2(DataContractType dataContractValue1);
    }

    [ServiceBehavior(IncludeExceptionDetailInFaults = true)]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class SimpleService : ISimpleService
    {
        public SimpleService()
        { }

        public string HelloWorld1(string value1)
        {
            return "Hello " + value1;
        }
        public string HelloWorld2(DataContractType dataContractValue1)
        {
            return "Hello " + dataContractValue1.FirstName +
                                " " + dataContractValue1.LastName;
        }
    }

    [DataContract]
    public class DataContractType
    {
        string firstName;
        string lastName;

        [DataMember]
        public string FirstName
        {
            get { return firstName; }
            set { firstName = value; }
        }
        [DataMember]
        public string LastName
        {
            get { return lastName; }
            set { lastName = value; }
        }
    }
Namespace Aspnet.Samples.SimpleService

    <ServiceContract(NameSpace="MyServices.org")> _
    Public Interface ISimpleService
        <OperationContract()> _
        Function HelloWorld1(ByVal value1 As String) As String
        <OperationContract()> _
        Function HelloWorld2(ByVal dataContractValue1 _
        As DataContractType) As String
    End Interface 'ISimpleService

    <ServiceBehavior(IncludeExceptionDetailInFaults:=True), _
    AspNetCompatibilityRequirements(RequirementsMode:= _
    AspNetCompatibilityRequirementsMode.Allowed)> _
    Public Class SimpleService
        Implements ISimpleService

        Public Sub New()

        End Sub 'New

        Public Function HelloWorld1(ByVal value1 As String) As String _
        Implements ISimpleService.HelloWorld1
            Return "Hello " + value1
        End Function 'HelloWorld1

        Public Function HelloWorld2(ByVal dataContractValue1 _
        As DataContractType) As String _
        Implements ISimpleService.HelloWorld2
            Return "Hello " + dataContractValue1.FirstName + " " + _
            dataContractValue1.LastName
        End Function 'HelloWorld2
    End Class 'SimpleService

    <DataContract()> _
    Public Class DataContractType
        Private _firstName As String
        Private _lastName As String


        <DataMember()> _
        Public Property FirstName() As String
            Get
                Return _firstName
            End Get
            Set(ByVal value As String)
                _firstName = value
            End Set
        End Property

        <DataMember()> _
        Public Property LastName() As String
            Get
                Return _lastName
            End Get
            Set(ByVal value As String)
                _lastName = value
            End Set
        End Property
    End Class 'DataContractType 
End Namespace

자세한 내용은 Creating WCF Services for ASP.NET AJAX를 참조하십시오.

ASP.NET 웹 페이지의 클라이언트 스크립트에서 WCF 서비스 사용

ASP.NET 웹 페이지의 클라이언트 스크립트에서 WCF 서비스를 호출하려면 먼저 ScriptManager 컨트롤을 페이지에 추가합니다. 그런 다음 asp:ServiceReference 자식 요소를 ScriptManager 컨트롤에 추가하고 해당 path 특성이 WCF 서비스를 가리키도록 설정하여 ServiceReference 개체를 선언적으로 설정합니다. 다음 예제에서는 서비스 참조를 보여 줍니다.

<asp:ScriptManager ID="ScriptManager1" >
  <Services>
    <asp:ServiceReference 
      Path="http://<serverhost>/SimpleService.svc"/>
  </Services>
</asp:ScriptManager>

ServiceReference 개체는 동일한 도메인의 웹 서비스만 참조할 수 있습니다. 웹 서비스 경로는 상대, 응용 프로그램 상대, 도메인 상대 또는 절대 경로일 수 있습니다. 절대 경로의 경우 경로는 동일한 도메인 내에 있어야 합니다.

ScriptManager 컨트롤이 포함된 페이지를 렌더링하면 해당 페이지에서 WCF 서비스용 JavaScript 프록시 클래스를 만듭니다. 프록시 클래스에는 각 서비스 작업에 해당하는 함수가 있습니다. 또한 페이지에는 웹 서비스 메서드의 입력 매개 변수 또는 반환 값으로 사용되는 서버 데이터 형식에 해당하는 JavaScript 프록시 클래스가 포함되어 있습니다. 이러한 클래스를 사용하면 이러한 매개 변수를 초기화하는 클라이언트 스크립트를 작성한 다음 메서드 호출에 전달할 수 있습니다.

참고 항목

개념

ASP.NET AJAX의 웹 서비스 사용

클라이언트 스크립트에서 웹 서비스 호출

기타 리소스

JSON 및 기타 데이터 전송 형식에 대한 지원

방법: 구성을 사용하여 ASP.NET AJAX 끝점 추가

ASP.NET AJAX용 WCF 서비스 만들기

방법: AJAX 사용 WCF 서비스 및 해당 서비스에 액세스하는 ASP.NET 클라이언트 만들기