다음을 통해 공유


Silverlight 응용 프로그램 만들기(WCF Data Services)

중요

Silverlight용 WCF Data Services 5.0 클라이언트 라이브러리는 Windows Phone 응용 프로그램에 대해 지원되지 않습니다.대신 Windows Phone 7.1 SDK에 포함된 Windows Phone용 OData 클라이언트 라이브러리를 사용해야 합니다.자세한 내용은 Windows Phone용 OData(Open Data Protoco) 개요를 참조하십시오.현재까지는 OData v3을 지원하는 Windows Phone용 클라이언트 라이브러리가 없습니다.

Silverlight용 WCF Data Services 클라이언트 라이브러리는 OData 프로토콜의 버전 3을 지원하는 데이터 서비스에 대한 HTTP 요청을 생성하고 OData 응답 피드의 데이터를 클라이언트의 개체로 변환합니다. 클라이언트 라이브러리의 두 가지 주요 클래스는 DataServiceContext 클래스와 DataServiceQuery<TElement> 클래스입니다. DataServiceContext 클래스는 지정한 데이터 서비스에 대해 실행되는 작업을 캡슐화합니다. OData 기반 서비스는 상태 비저장 서비스입니다. 하지만 클라이언트에서 DataServiceContext가 데이터 서비스와의 상호 작용 간에 엔터티의 상태를 유지합니다. 이로 인해 클라이언트가 변경 추적 및 ID 관리와 같은 기능을 지원할 수 있습니다. DataServiceQuery<TElement> 클래스는 특정 엔터티 집합에 대한 쿼리를 나타냅니다. 자세한 내용은 .NET Framework 응용 프로그램에서 데이터 서비스 사용(WCF 데이터 서비스)를 참조하십시오. Northwind 샘플 데이터 서비스의 피드를 소비하는 실제 응용 프로그램 예를 보려면 Silverlight에 대한 WCF 데이터 서비스 빠른 시작 설명서를 참조하십시오.

참고

Silverlight에 대해 WCF Data Services 클라이언트 라이브러리를 사용할 때는 서비스에 대한 모든 요청이 비동기적으로 수행됩니다.자세한 내용은 비동기 작업(WCF Data Services)을 참조하십시오.

이 항목에는 다음과 같은 단원이 포함되어 있습니다.

클라이언트 데이터 서비스 클래스 생성

Visual Studio의 서비스 참조 추가 대화 상자를 사용하여 OData 피드를 노출하는 서비스에 대한 참조를 추가할 수 있습니다. 자세한 내용은 클라이언트 데이터 서비스 클래스 생성(WCF Data Services)을 참조하십시오. 명령 프롬프트에서 DataSvcUtil.exe 도구를 사용하여 클라이언트 데이터 서비스 클래스를 생성할 수도 있습니다. 자세한 내용은 방법: 수동으로 클라이언트 데이터 서비스 클래스 생성(WCF Data Services)을 참조하십시오.

참고

WCF Data Services 5.0 릴리스가 설치된 경우 서비스 참조 추가 도구가 Silverlight에 포함된 System.Data.Services.Client.dll 버전에 대한 참조를 추가하는 대신 Microsoft.Data.Services.Client.SL.dll 버전에 대한 참조를 자동으로 추가합니다.특정 이유로 인해 대신 이전 버전의 Silverlight 클라이언트를 사용해야 할 경우 클라이언트 라이브러리의 Silverlight 버전에 대한 참조를 수동으로 추가해야 합니다.자세한 내용은 방법: 수동으로 클라이언트 데이터 서비스 클래스 생성(WCF Data Services)을 참조하십시오.

리소스 액세스 및 변경

Silverlight 기반 응용 프로그램에서 데이터 서비스에 대한 모든 작업은 비동기입니다. DataServiceContextDataServiceQuery<TElement> 클래스에 각각 Begin 및 End로 시작하는 한 쌍의 메서드를 사용하여 비동기 작업을 수행합니다. Begin 메서드는 작업이 완료될 때 서비스에서 호출하는 대리자를 등록합니다. End 메서드는 완료된 작업의 콜백을 처리하도록 등록된 대리자에서 호출해야 합니다. End 메서드를 호출하여 비동기 작업을 완료하는 경우 작업을 시작하는 데 사용한 것과 동일한 DataServiceQuery<TElement> 또는 DataServiceContext 인스턴스에서 완료해야 합니다. 각 Begin 메서드는 상태 개체를 콜백에 전달할 수 있는 state 매개 변수를 사용합니다. 이 상태 개체는 콜백이 제공되고 해당 End 메서드를 호출하여 비동기 작업을 완료하는 데 사용되는 IAsyncResult로 검색됩니다. 예를 들어, DataServiceQuery<TElement> 인스턴스의 BeginExecute 메서드를 호출할 때 이 인스턴스를 state 매개 변수로 제공하면 동일한 DataServiceQuery<TElement> 인스턴스가 IAsyncResult로 반환됩니다. 이 DataServiceQuery<TElement> 인스턴스는 EndExecute 메서드를 호출하여 쿼리 작업을 완료하는 데 사용됩니다. 자세한 내용은 비동기 작업(WCF Data Services)을 참조하십시오.

Silverlight에 대한 WCF Data Services 클라이언트 라이브러리는 네트워크 프로토콜을 사용하여 비동기적으로 데이터 서비스에 액세스하므로 Dispatcher 클래스의 BeginInvoke 메서드를 사용하여 응답 작업을 다시 Silverlight 기반 응용 프로그램의 기본 응용 프로그램 스레드(UI 스레드)로 올바르게 마샬링해야 합니다. 자세한 내용은 Synchronizing Data for Multithreading를 참조하십시오.

리소스 쿼리

Silverlight에 대한 WCF Data Services 클라이언트 라이브러리에서는 LINQ(통합 언어 쿼리) 사용을 포함하여 익숙한 .NET Framework 프로그래밍 패턴을 사용하여 OData 데이터 서비스에 대해 쿼리를 실행할 수 있습니다. DataServiceQuery<TElement> 또는 DataServiceContext에서 BeginExecute 메서드를 호출하면 클라이언트 라이브러리가 쿼리 또는 URI(Uniform Resource Identifier)를 HTTP GET 요청 메시지로 변환합니다. 클라이언트 라이브러리는 해당 응답 메시지를 받아 클라이언트 데이터 서비스 클래스의 인스턴스로 변환합니다. 이러한 클래스는 DataServiceQuery<TElement>가 속해 있는 DataServiceContext에 의해 추적됩니다. 자세한 내용은 방법: 비동기 데이터 서비스 쿼리 실행(WCF Data Service)을 참조하십시오.

일부 시나리오에서는 쿼리에서 반환된 피드에서의 엔터티 수뿐만 아니라 엔터티 집합의 총 엔터티 수를 아는 것이 유용합니다. 집합에 있는 이 총 엔터티 수가 쿼리 결과에 포함되도록 요청하려면 DataServiceQuery<TElement>IncludeTotalCount 메서드를 호출합니다. 이 경우 반환된 QueryOperationResponse<T>TotalCount 속성은 집합의 총 엔터티 수를 반환합니다. 또한 AddQueryOption 메서드를 사용하여 OData에서 지원되는 다른 쿼리 옵션을 쿼리에 추가할 수 있습니다. 자세한 내용은 데이터 서비스 쿼리(WCF Data Services)를 참조하십시오.

LINQ 쿼리

DataServiceQuery<TElement> 클래스가 LINQ로 정의된 IQueryable<T> 인터페이스를 구현하기 때문에 Silverlight에 대한 WCF Data Services 클라이언트 라이브러리는 엔터티 집합 데이터에 대한 LINQ 쿼리를 데이터 서비스 리소스에 대해 평가되는 쿼리 식을 나타내는 URI로 변환할 수 있습니다. 예를 들어 다음 LINQ 쿼리는 customerId 텍스트 상자에 사용자가 제공한 CustomerID 속성 값으로 필터링된 Order 엔터티의 컬렉션인 피드를 반환합니다.

' Define a query that returns orders for a give customer.
Dim query = From orderByCustomer In context.Orders _
                Where orderByCustomer.Customer.CustomerID = _
                Me.customerId.Text _
                Select orderByCustomer
// Define a query that returns orders for a give customer.
var query = from orderByCustomer in context.Orders
            where orderByCustomer.Customer.CustomerID == this.customerId.Text
            select orderByCustomer;

지연된 콘텐츠 로드

WCF Data Services는 기본적으로 쿼리에서 반환되는 데이터 양을 제한합니다. 그러나 필요한 경우 데이터 서비스에서 관련 엔터티, 페이징 응답 데이터 및 이진 데이터 스트림을 포함한 추가 데이터를 명시적으로 로드할 수 있습니다. 쿼리를 실행하면 주소가 지정된 엔터티 집합의 엔터티만 반환됩니다. 예를 들어, Northwind 데이터 서비스에 대한 쿼리가 Customers 엔터티를 반환하는 경우 Customers 및 Orders 간에 관계가 있어도 기본적으로 관련 Orders 엔터티가 반환되지 않습니다. 관련 엔터티는 원본 쿼리(즉시 로드) 또는 엔터티당 기준(명시적 로드)로 로드할 수 있습니다. 자세한 내용은 지연된 콘텐츠 로드(WCF Data Services)를 참조하십시오. Silverlight 클라이언트 및 DataServiceCollection<T>을 사용할 때는 LoadAsync를 호출하여 탐색 속성에서 관련 엔터티 컬렉션을 로드할 수 있습니다.

관련 엔터티를 로드할 패턴을 결정할 때는 메시지 크기와 데이터 서비스에 대한 요청 수 간의 성능상 장단점을 고려해야 합니다.

데이터 서비스에서 페이징을 사용하도록 설정한 경우 반환된 항목 수가 페이징 한도를 초과하는 경우 이후 데이터 페이지를 데이터 서비스에서 명시적으로 로드해야 합니다. 페이징이 발생할 수 있는 시간을 미리 확인할 수는 없으므로 페이징된 OData 피드를 올바르게 처리하도록 Silverlight 클라이언트 응용 프로그램을 설정하는 것이 좋습니다. 페이징 응답을 처리하는 방법에 대한 예는 방법: 데이터 서비스 데이터를 컨트롤에 바인딩(Silverlight 클라이언트)데이터 서비스 쿼리(WCF Data Services)를 참조하십시오.

쿼리 프로젝션

프로젝션은 엔터티의 특정 속성만 응답에서 반환되도록 지정하여 쿼리에서 반환되는 피드의 데이터 양을 줄이는 메커니즘을 OData에서 제공합니다. 자세한 내용은 OData: 시스템 쿼리 옵션 선택($select)을 참조하십시오. select 절(Visual Basic의 경우 Select)을 사용하여 LINQ 쿼리에 프로젝션 절을 추가할 수 있습니다. 반환된 엔터티 데이터는 클라이언트에서 엔터티 형식이나 비 엔터티 형식으로 프로젝션될 수 있습니다. 비 엔터티 형식에 대한 변경 사항은 데이터 서비스에 저장할 수 없습니다. 예를 들어 다음 LINQ 쿼리는 Customer 데이터를 클라이언트에서 새로운 CustomerAddress 엔터티 형식으로 프로젝션합니다.

Dim query = From c In context.Customers _
                    Where c.Country = "Germany" _
                    Select New CustomerAddress With
                        {.CustomerID = c.CustomerID, _
                         .Address = c.Address, _
                         .City = c.City, _
                         .PostalCode = c.PostalCode, _
                         .Country = c.Country _
                        }
var query = from c in context.Customers
            where c.Country == "Germany"
            select new CustomerAddress
            {
                CustomerID = c.CustomerID,
                Address = c.Address,
                City = c.City,
                PostalCode = c.PostalCode,
                Country = c.Country
            };

중요

프로젝션된 형식을 업데이트한 내용을 저장할 때 데이터 서비스에서 데이터가 손실될 수 있습니다.자세한 내용은 WCF Data Services 클라이언트 설명서에서 프로젝션 고려 사항을 참조하십시오.

자세한 내용은 방법: 데이터 서비스 쿼리 결과 프로젝션(Silverlight 클라이언트)을 참조하십시오.

리소스 수정 및 변경 내용 저장

클라이언트는 DataServiceContext의 다음 메서드를 수동으로 실행하여 보고하는 엔터티의 변경 내용을 추적합니다.

클라이언트는 이러한 메서드를 사용하여 추가된 엔터티와 삭제된 엔터티를 추적하고 속성 값 또는 엔터티 인스턴스 간의 관계에 대한 변경 내용도 추적할 수 있습니다. 서비스 참조 추가 대화 상자를 사용하여 클라이언트 데이터 서비스 클래스를 생성하는 경우 생성된 DataServiceContext 클래스의 각 엔터티에 대해서도 AddTo 메서드가 만들어집니다. 이러한 메서드를 사용하여 새 엔터티 인스턴스를 엔터티 집합에 추가하고 이러한 추가 작업을 컨텍스트에 보고합니다. 이렇게 추적된 변경 내용은 사용자가 BeginSaveChangesEndSaveChanges 메서드를 호출할 때 데이터 서비스에 비동기적으로 전송됩니다.

AddObject 메서드나 적합한 AddTo 메서드를 사용하여 새 엔터티를 추가할 때는 새 엔터티 및 관련 엔터티 간의 관계가 자동으로 정의되지 않습니다. 엔터티 인스턴스 간의 관계를 만들고 변경할 수 있으며 클라이언트 라이브러리에서 이러한 변경 사항을 데이터 서비스에 반영하도록 지정할 수 있습니다. 엔터티 간의 관계는 모델에서 연결로 정의되며 DataServiceContext는 각 관계를 컨텍스트의 링크 개체로 추적합니다. WCF Data Services에서는 이러한 링크를 만들고 수정 및 삭제할 수 있도록 DataServiceContext 클래스에 대해 다음 메서드를 제공합니다.

자세한 내용은 데이터 서비스(WCF Data Services/Silverlight) 업데이트를 참조하십시오.

이진 데이터로 작업

OData는 데이터가 속하는 엔터티에서 이진 데이터를 별도로 액세스하기 위한 메커니즘을 정의합니다. 이렇게 하면 OData 서비스가 큰 이진 데이터를 미디어 링크 항목에 속하는 미디어 리소스로 노출할 수 있습니다. Silverlight에 대한 WCF Data Services 클라이언트는 OData 서비스의 미디어 리소스를 이진 스트림으로 소비할 수 있습니다. 이진 스트림에 액세스하려면 미디어 링크 항목인 엔터티를 추적하는 DataServiceContext 인스턴스에서 BeginGetReadStream 메서드를 호출합니다. 이러한 비동기 메서드는 콜백으로 반환된 DataServiceContext 인스턴스에서 EndGetReadStream 메서드가 호출될 때 DataServiceStreamResponse 개체를 반환합니다. 마찬가지로 SetSaveStream 메서드를 호출할 때 그리고 BeginSaveChangesEndSaveChanges 메서드를 호출한 후 미디어 리소스가 OData 서비스에 전송됩니다. 자세한 내용은 방법: 이진 데이터를 스트림으로 액세스(Silverlight 클라이언트)을 참조하십시오.

데이터 바인딩

Silverlight에 대한 WCF Data Services 클라이언트는 DataServiceCollection<T> 클래스를 사용하여 컨트롤에 대한 데이터 바인딩을 지원합니다. ObservableCollection<T>에서 상속되는 이 클래스는 항목을 컬렉션에 추가하거나 컬렉션에서 제거할 때 알림을 제공하는 동적 데이터 컬렉션을 나타냅니다. 이러한 알림을 통해 DataServiceContext는 변경 추적 메서드를 명시적으로 호출할 필요 없이 변경 내용을 자동으로 추적할 수 있습니다. DataServiceCollection<T>DataServiceQuery<TElement>를 기반으로 정의됩니다. 이 쿼리를 실행하면 컬렉션에 대한 개체를 제공합니다.

LoadAsync 메서드는 쿼리를 비동기적으로 실행하고 결과를 컬렉션에 로드하는 데 사용됩니다. 이 메서드는 결과가 올바른 스레드로 마샬랑되도록 보증하므로 Dispatcher를 사용할 필요가 없습니다. 데이터 바인딩을 위해 DataServiceCollection<T>의 인스턴스를 사용할 때는 클라이언트에서 DataServiceContext로 추적된 개체가 바인딩된 UI 요소의 데이터와 동기화된 상태로 유지되는지 확인합니다. 바인딩 컬렉션에서 엔터티의 변경 내용을 DataServiceContext에 수동으로 보고할 필요는 없습니다. 자세한 내용은 방법: 데이터 서비스 데이터를 컨트롤에 바인딩(Silverlight 클라이언트)을 참조하십시오.

도메인 간 실행

Silverlight를 사용하면 별개의 도메인에 호스트되는 서비스에 액세스할 수 있습니다. 이러한 액세스 형식은 서버에 도메인 간 정책 파일을 배포하여 명시적으로 사용 가능하도록 설정해야 합니다. 이 기능은 Silverlight 클라이언트 HTTP 구현에 포함됩니다.

참고

Silverlight 클라이언트가 도메인 간 조건에서 웹 서비스에 액세스하도록 허용하려면 먼저 다음과 같은 중요한 보안 사항을 고려해야 합니다.자세한 내용은 HTTP Communication and Security with Silverlight을 참조하십시오.

데이터 서비스에 대한 대부분의 요청에 대해 Silverlight에 대한 WCF Data Services 클라이언트에는 XMLHTTP 구현이 사용됩니다. 하지만 WCF Data Services 클라이언트가 도메인 간 요청을 검색하면 Silverlight 클라이언트 HTTP 구현을 사용하도록 자동으로 전환됩니다.

참고

클라이언트는 HttpStack 속성이 Auto로 설정된 경우에만 HTTP 구현으로 자동 전환됩니다.

Silverlight 기반 응용 프로그램에서 도메인 간 요청을 허용하도록 데이터 서비스를 구성하는 방법에 대한 예를 보려면 도메인 간 및 브라우저 외부 시나리오에서 ADO.NET Data Services Silverlight 클라이언트 사용을 참조하십시오. 도메인 간 실행에 대한 지원은 Silverlight 4에서 처음 제공됩니다.

브라우저 외부 실행

사용자가 해당 호스트 웹 페이지에서 Silverlight 기반 응용 프로그램을 설치하고 브라우저 외부에서 실행하도록 구성할 수 있습니다. Silverlight에 대한 WCF Data Services 클라이언트는 브라우저 외부 실행을 지원합니다. WCF Data Services 클라이언트에서 응용 프로그램이 브라우저 외부에서 실행되는 것으로 검색되면 Silverlight 클라이언트 HTTP 구현을 사용하도록 자동으로 전환됩니다. 이러한 동작은 도메인 간 실행에서 발생하는 동작과 동일하지만 도메인 간 정책 파일이 필요하지 않습니다. 자세한 내용은 Out-of-Browser Support을 참조하십시오.

클라이언트 인증

기본적으로 Silverlight에 대한 WCF Data Services 클라이언트가 웹 브라우저와 동일한 클라이언트 자격 증명을 사용하여 데이터 서비스를 요청하며, 인증은 웹 브라우저에서 관리됩니다. 하지만 데이터 서비스를 액세스하기 위해 도메인 간 요청이 필요하거나 Silverlight 응용 프로그램이 웹 브라우저 외부에서 실행될 경우 요청을 수행할 때 제공된 자격 증명을 지정할 수 있습니다. 이러한 시나리오에서 클라이언트는 자동으로 Silverlight 클라이언트 HTTP 구현을 사용하여 요청을 수행하며, 인증을 위해 기본 자격 증명이 사용됩니다. 하지만 UseDefaultCredentials 속성이 false로 설정된 경우 데이터 서비스에서 인증을 수행할 때 Credentials 속성에 지정된 ICredentials가 클라이언트에 사용됩니다.

경고

사용자 자격 증명은 실행 중에만 요청되어야 하며 캐시되어서는 안 됩니다.자격 증명은 항상 안전하게 보관해야 합니다.

또한 응용 프로그램이 Silverlight 클라이언트 HTTP 구현을 사용하도록 요청하여 자격 증명을 제공할 수도 있습니다. 이렇게 하려면 HttpStack 속성의 값을 ClientHttp로 설정해야 합니다. 다음 코드는 데이터 서비스에 액세스할 때 실행 중 사용자로부터 수집된 자격 증명이 사용되도록 보장합니다.

' Select the client HTTP stack and set the credentials.
context.HttpStack = HttpStack.ClientHttp
context.UseDefaultCredentials = False
context.Credentials = _
    New NetworkCredential(userName, password, domain)
// Select the client HTTP stack and set the credentials.
context.HttpStack = HttpStack.ClientHttp;
context.UseDefaultCredentials = false;
context.Credentials = 
    new NetworkCredential(userName, password, domain);

Silverlight 클라이언트 HTTP 구현이 사용되지 않는 경우 UseDefaultCredentials 속성의 값을 false로 설정하면 실행 중에 예외가 발생합니다. UseDefaultCredentials의 값이 true로 설정된 경우 Credentials 속성이 설정되었더라도 기본 자격 증명이 사용됩니다.

경고

기본 및 다이제스트 인증과 함께 전송된 데이터는 암호화되지 않으므로 악의적 사용자가 데이터를 볼 수 있습니다.또한 기본 인증 자격 증명(사용자 이름 및 암호)은 일반 텍스트로 보내지므로 누군가 이를 가로챌 수 있습니다.

자세한 내용은 방법: 데이터 서비스 요청에 대한 클라이언트 자격 증명 지정(Silverlight 클라이언트)을 참조하십시오. Silverlight 응용 프로그램으로부터 ASP.NET 폼 인증을 사용하는 데이터 서비스에 액세스하는 방법에 대한 예를 보려면 도메인 간 및 브라우저 외부 시나리오에서 ADO.NET Data Services Silverlight 클라이언트 라이브러리 사용 – II(폼 인증) 문서를 참조하십시오.