정보
요청한 주제가 아래에 표시됩니다. 그러나 이 주제는 이 라이브러리에 포함되지 않습니다.

Windows Phone 8의 OData 클라이언트

2014-06-18

적용 대상: Windows Phone 8 및 Windows Phone Silverlight 8.1 | Windows Phone OS 7.1

 

OData(Open Data Protocol)는 REST(Representational State Transfer) 리소스 스타일로 데이터에 액세스할 수 있도록 하는 엔터티 및 관계 모델을 기반으로 합니다. Windows Phone 의 OData 클라이언트 라이브러리를 사용하면 Windows Phone 앱에서 표준 HTTP 프로토콜을 사용하여 쿼리를 실행할 수 있으며 데이터 서비스에서 데이터를 만들고 업데이트하며 삭제할 수도 있습니다. Windows Phone의 OData 클라이언트는 Windows Phone SDK에 포함되지 않으므로 WCF Data Services Tools for Visual Studio에서 별도로 다운로드해야 합니다. 클라이언트 라이브러리는 OData v3 프로토콜을 지원하는 모든 서비스에 대한 HTTP 요청을 생성하고 응답 피드의 데이터를 클라이언트의 개체로 변환합니다. OData 및 Windows Phone 의 OData 클라이언트 라이브러리를 사용하여 액세스할 수 있는 기존 데이터 서비스에 대한 자세한 내용은 OData 웹 사이트를 참조하세요.

클라이언트 라이브러리의 두 가지 기본 클래스는 DataServiceContextDataServiceCollection입니다. DataServiceContext 클래스는 특정 데이터 서비스에 대해 실행되는 작업을 캡슐화합니다. OData 기반 서비스는 상태를 저장하지 않습니다. 그러나 DataServiceContext 클래스는 데이터 서비스를 사용하는 동안 클라이언트에서 엔터티 상태를 유지합니다. 따라서 클라이언트에서 변경 추적, ID 관리 등과 같은 기능을 지원할 수 있습니다. Windows Phone 의 OData 클라이언트 라이브러리는 .NET Framework에 포함된 WCF Data Services 클라이언트에서 제공되는 OData 서비스에 비동기적으로 액세스하는 동일한 기능을 제공합니다.

이 항목의 다음 섹션에서는 클라이언트 라이브러리를 사용하여 OData 서비스에 액세스하는 방법에 대해 설명합니다.

Visual Studio 에서 서비스 참조 추가 대화 상자를 사용하여 OData 피드를 노출하는 서비스에 대한 참조를 추가할 수 있습니다. 자세한 내용은 Windows Phone 8의 OData 서비스를 사용하는 방법을 참조하세요. 명령 프롬프트에서 DataSvcUtil.exe 도구를 사용하여 클라이언트 프록시 클래스를 생성할 수도 있습니다.

ObservableCollection<T>에서 상속되는 DataServiceCollection 클래스는 컬렉션에서 항목이 추가되거나 제거되면 알림을 제공하는 동적 데이터 모음을 나타냅니다. 이러한 알림을 사용하면 DataServiceContext에서 변경 추적 메서드를 명시적으로 호출하지 않고 변경 내용을 자동으로 추적할 수 있습니다.

쿼리에 따라 DataServiceCollection 인스턴스에 포함될 데이터 개체가 결정됩니다. 쿼리는 DataServiceQuery 클래스를 사용하여 LINQ(통합 언어 쿼리) 쿼리로 작성하거나 URI(Uniform Resource Identifier) 형식으로 제공할 수 있습니다. OData의 URI 쿼리 구문에 대한 자세한 내용은 OData: URI 규칙을 참조하세요. 이 쿼리는 DataServiceCollection 클래스의 LoadAsync(IQueryable<UTP>) 메서드에서 매개 변수로 지정됩니다. 실행될 경우 이 메서드는 컬렉션의 데이터 개체로 역직렬화되는 OData 피드를 반환합니다.

DataServiceCollection 클래스의 LoadAsync(IQueryable<UTP>) 메서드를 사용하면 결과가 올바른 스레드에 마샬링되므로 Dispatcher 개체를 사용할 필요가 없습니다. LoadCompleted() 이벤트는 데이터 서비스에서 응답을 받은 후에 발생합니다.

참고참고:

CancelAsyncLoad() 메서드를 호출하면 활성 LoadAsync() 작업을 취소할 수 있습니다.

데이터 바인딩에 DataServiceCollection 인스턴스를 사용하는 경우 클라이언트에서 DataServiceContext에 의해 추적되는 개체가 바인딩된 UI 요소의 데이터와 동기화된 상태로 유지됩니다. 따라서 바인딩 컬렉션의 엔터티에 대한 변경 내용을 수동으로 보고할 필요가 없습니다.

팁팁:

데이터 서비스에서 반환한 모델에 따라 모델이 생성되는 데이터 앱에는 MVVM(Model-View-ViewModel) 디자인 패턴을 사용하는 것이 좋습니다. 이 방법을 사용하면 ViewModel 클래스에 DataServiceContext를 만들고 필요한 DataServiceCollection 인스턴스 또는 Windows Phone 컨트롤에 데이터를 바인딩하는 데 필요한 다른 데이터 구조를 노출할 수 있습니다. MVVM 패턴에 대한 자세한 내용은 Windows Phone 8의 Model-View-ViewModel 패턴 구현을 참조하세요.

Windows Phone 앱에서 모든 데이터 서비스 관련 작업은 비동기적으로 실행됩니다. DataServiceContext 클래스에서 각각 BeginEnd로 시작하는 메서드 쌍을 사용하여 비동기 작업을 수행합니다. Begin 메서드는 작업을 완료한 후 서비스에서 호출하는 대리자를 등록합니다. End 메서드는 완료된 작업에서 콜백을 처리하도록 등록된 대리자에서 호출되어야 합니다.

참고참고:

DataServiceCollection 클래스를 사용하면 비동기 작업과 마샬링이 자동으로 전달됩니다. 비동기 작업을 직접 사용하는 경우 Dispatcher 클래스의 BeginInvoke 메서드를 사용하여 앱의 주 앱 스레드(UI 스레드)로 다시 응답 작업을 정확하게 마샬링해야 합니다.

End 메서드를 호출하여 비동기 작업을 완료하는 경우 작업을 시작하는 데 사용된 것과 동일한 DataServiceContext 인스턴스에서 작업을 수행해야 합니다. 각 Begin 메서드는 상태 개체를 콜백에 전달할 수 있는 매개 변수를 사용합니다. 이 상태 개체는 콜백과 함께 제공되는 IAsyncResult 인터페이스를 사용하여 검색되며 해당 End 메서드를 호출하여 비동기 작업을 완료하는 데 사용됩니다.

예를 들어 인스턴스에서 BeginExecute``1(DataServiceQueryContinuation<UMP>, AsyncCallback, Object) 메서드를 호출할 때 DataServiceContext 인스턴스를 state 매개 변수로 제공한 경우 동일한 DataServiceContext 인스턴스가 IAsyncResult 매개 변수로 반환됩니다. 그러면 DataServiceContext의 이 인스턴스는 EndExecute``1(IAsyncResult) 메서드를 호출하여 쿼리 작업을 완료하는 데 사용됩니다. 자세한 내용은 비동기 작업(WCF Data Services)을 참조하세요.

리소스 쿼리

Windows Phone 의 OData 클라이언트 라이브러리에서는 LINQ(통합 언어 쿼리) 사용을 포함한 익숙한 프로그래밍 패턴을 사용하여 OData 서비스에 대한 쿼리를 실행할 수 있습니다. DataServiceQuery 또는 쿼리 URI를 실행하면(일반적으로 LoadAsync(IQueryable<UTP>) 메서드를 호출하는 경우) 클라이언트 라이브러리에서 쿼리 또는 URI를 HTTP GET 요청 메시지로 변환합니다. 클라이언트 라이브러리는 해당 응답 메시지를 받고 반환된 피드의 항목을 클라이언트 데이터 서비스 클래스의 인스턴스로 변환합니다. 이러한 클래스는 DataServiceQuery가 속하는 DataServiceContext에 의해 추적됩니다.

경우에 따라 쿼리에서 반환한 피드의 수가 아니라 엔터티 집합의 총 엔터티 수를 알고 있으면 도움이 됩니다. DataServiceQuery에서 IncludeTotalCount() 메서드를 호출하여 집합의 이 총 엔터티 수를 쿼리 결과에 포함하도록 요청합니다. 이 경우 반환된 QueryOperationResponseTotalCount() 속성에서 집합의 총 엔터티 수를 반환합니다. QueryOperationResponseLoadCompleted() 이벤트를 처리할 때 받은 LoadCompletedEventArgs에서 가져올 수 있습니다.

DataServiceQuery 클래스를 사용하여 쿼리를 작성하면 AddQueryOption(String, Object) 메서드를 사용하여 OData에서 지원하는 다른 쿼리 옵션을 쿼리에 추가할 수도 있습니다.

LINQ 쿼리

DataServiceQuery 클래스는 IQueryable을 구현하므로 Windows Phone 의 OData 클라이언트 라이브러리에서 엔터티 집합 데이터에 대한 LINQ 쿼리를 데이터 서비스 리소스에 대해 평가되는 쿼리 식을 나타내는 URI로 변환할 수 있습니다. 예를 들어 다음 LINQ 쿼리는 사용자가 customerId 텍스트 상자에 제공한 CustomerID 속성 값에 따라 필터링된 Order 엔터티 컬렉션을 포함하는 피드를 반환합니다.

// Define a query that returns orders for a given customer. 
    var query = from orderByCustomer in context.Orders 
        where orderByCustomer.Customer.CustomerID == this.customerId.Text 
        select orderByCustomer; 

지연 콘텐츠 로드

기본적으로 OData는 쿼리에서 반환하는 데이터의 양을 제한합니다. 그러나 필요한 경우 관련 엔터티, 페이징 응답 데이터 및 이진 데이터 스트림을 포함한 추가 데이터를 데이터 서비스에서 명시적으로 로드할 수 있습니다. 쿼리를 실행하면 주소가 지정된 엔터티 집합의 엔터티만 반환됩니다.

예를 들어 Northwind 데이터 서비스에 대한 쿼리에서 Customers 엔터티를 반환하면 CustomersOrders 사이에 관계가 있는 경우에도 기본적으로 관련 Orders 엔터티가 반환되지 않습니다. 관련 엔터티는 원본 쿼리를 사용하여 로드(즉시 로드)하거나 엔터티별로 로드(명시적 로드)할 수 있습니다.

관련 엔터티를 명시적으로 로드하려면 탐색 속성이 반환한 DataServiceCollection에서 LoadAsync() 메서드를 호출하거나 DataServiceContext 클래스에서 BeginLoadProperty(Object, String, AsyncCallback, Object)EndLoadProperty(IAsyncResult) 메서드를 호출해야 합니다. 관련 엔터티를 로드하려는 각 엔터티에 대해 한 번만 이 작업을 수행합니다. 이러한 메서드를 호출할 때마다 데이터 서비스에 대한 새로운 요청이 생성됩니다. 관련 엔터티 즉시 로드를 수행하려면 DataServiceQuery에서 $expand 쿼리 옵션을 생성된 쿼리 URI에 추가하는 Expand(String) 메서드를 사용해야 합니다. 그러면 관련된 모든 데이터가 단일 요청으로 로드되지만 훨씬 더 큰 페이로드가 반환됩니다.

중요중요:

관련 엔터티 로드 패턴을 결정할 때는 데이터 서비스에 대한 요청 수와 메시지 크기 간의 성능과 관련된 상충 부분을 고려합니다.

다음 LINQ 쿼리는 선택한 고객에 속하는 OrderOrder_Details 개체의 즉시 로드 예를 보여 줍니다.


// Define a query that returns orders along with order details for a given customer.
var query = from orderByCustomer in context.Orders.Expand("Order_Details")
            where orderByCustomer.Customer.CustomerID == this.customerId.Text
            select orderByCustomer;

데이터 서비스에서 페이징을 사용하도록 설정한 경우 반환된 항목 수가 페이징 제한을 초과하면 데이터 서비스에서 후속 데이터 페이지를 명시적으로 로드해야 합니다. 페이징이 발생할 수 있는 시기를 미리 확인할 수 없기 때문에 앱이 페이징 OData 피드를 제대로 처리할 수 있게 하는 것이 좋습니다. 페이징 응답을 로드하려면 현재 DataServiceQueryContinuation 토큰을 사용하여 BeginLoadProperty(Object, String, AsyncCallback, Object) 메서드를 호출해야 합니다. DataServiceCollection 클래스를 사용하는 경우 LoadAsync() 메서드를 호출하는 것과 동일한 방식으로 LoadNextPartialSetAsync() 메서드를 대신 호출할 수 있습니다. 이러한 로드 패턴에 대한 예는 Windows Phone 8의 OData 서비스를 사용하는 방법을 참조하세요.

이진 데이터 작업

OData는 자신이 속한 엔터티와 분리된 이진 데이터에 액세스하는 메커니즘을 정의합니다. 이런 식으로 OData 서비스는 관련된 미디어 링크 항목에 속한 미디어 리소스로 큰 이진 데이터를 노출할 수 있습니다. Windows Phone 의 OData 클라이언트 라이브러리는 OData 서비스의 미디어 리소스를 이진 스트림으로 사용할 수 있습니다. 이진 스트림에 액세스하려면 미디어 링크 항목인 엔터티를 추적하는 DataServiceContext 인스턴스에 대해 BeginGetReadStream(Object, DataServiceRequestArgs, AsyncCallback, Object) 메서드를 호출합니다. 이 비동기 메서드는 EndGetReadStream(IAsyncResult) 메서드가 DataServiceContext에서 호출될 때 DataServiceStreamResponse 개체를 반환합니다. 미디어 리소스를 격리된 저장소에 저장할 때 사용할 수 있는 스트림으로 미디어 리소스를 반환하려는 경우 이 작업을 수행합니다.

미디어 리소스를 UI의 Image 컨트롤에 바인딩할 때 GetReadStreamUri(Object) 메서드를 대신 호출하여 바인딩 도중 이미지를 만드는 데 사용되는 미디어 리소스의 미디어 편집 URI를 가져올 수 있습니다. 데이터 바인딩을 지원하려면 바인딩에 사용되는 확장 속성의 getter 또는 바인딩에 사용되는 값 변환기에서 GetReadStreamUri(Object) 메서드를 호출할 수 있습니다. 자세한 내용은 XAML 컨트롤에 미디어 리소스 스트림 바인딩 게시물을 참조하세요.

OData 서비스에 새 미디어 리소스를 만들려면 먼저 새 엔터티 인스턴스를 만든 다음 SetSaveStream(Object, Stream, Boolean, String, String) 메서드를 호출하여 새 미디어 링크 항목 인스턴스에 대한 미디어 리소스 데이터를 포함하는 Stream 개체를 제공합니다. 클라이언트는 BeginSaveChanges(AsyncCallback, Object)EndSaveChanges(IAsyncResult) 메서드가 호출된 후 새 미디어 리소스를 삽입하라는 POST 요청을 보냅니다. 자세한 내용은 Windows Phone 7 응용프로그램에서 미디어 리소스 스트림 액세스를 참조하세요.

쿼리 프로젝션

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

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 클라이언트 설명서의 프로젝션 고려 사항을 참조하세요.

클라이언트의 CustomerAddress 형식 정의를 포함하여 전체 예제를 보려면 방법: 데이터 서비스 쿼리 프로젝션을 참조하세요.

DataServiceContext 클래스에서 AddObject(String, Object), UpdateObject(Object)DeleteObject(Object) 메서드를 사용하여 OData 클라이언트의 변경 내용을 수동으로 추적합니다. 클라이언트에서는 이러한 메서드를 사용하여 추가되거나 삭제된 엔터티를 추적하고 속성 값 변경 또는 엔터티 인스턴스 사이의 관계 변경을 추적합니다.

프록시 클래스가 생성될 때 DataServiceContext 클래스의 각 엔터티에 대해 AddTo 메서드가 만들어집니다. 이러한 메서드를 사용하여 새 엔터티 인스턴스를 엔터티 집합에 추가하고 추가 사항을 컨텍스트에 보고합니다. DataServiceContext 클래스의 BeginSaveChanges(AsyncCallback, Object)EndSaveChanges(IAsyncResult) 메서드를 호출하면 추적된 변경 내용이 데이터 서비스에 비동기적으로 다시 전송됩니다.

참고참고:

DataServiceCollection 개체를 사용하여 데이터를 컨트롤에 바인딩하면 변경 내용이 DataServiceContext 인스턴스에 자동으로 보고되며 컬렉션의 개체에 대한 변경 내용을 보고할 필요가 없습니다.

다음 예제에서는 BeginSaveChanges(SaveChangesOptions, AsyncCallback, Object)EndSaveChanges(IAsyncResult) 메서드를 호출하여 Northwind 데이터 서비스에 업데이트를 비동기적으로 보내는 방법을 보여 줍니다.

private void saveChanges_Click(object sender, RoutedEventArgs e)
{
    // Start the saving changes operation.
    svcContext.BeginSaveChanges(SaveChangesOptions.Batch, 
        OnChangesSaved, svcContext);
}

private void OnChangesSaved(IAsyncResult result)
{
    // Use the Dispatcher to ensure that the 
    // asynchronous call returns in the correct thread.
    Dispatcher.BeginInvoke(() =>
        {
            svcContext = result.AsyncState as NorthwindEntities;

            try
            {
                // Complete the save changes operation and display the response.
                WriteOperationResponse(svcContext.EndSaveChanges(result));
            }
            catch (DataServiceRequestException ex)
            {
                // Display the error from the response.
                WriteOperationResponse(ex.Response);
            }
            catch (InvalidOperationException ex)
            {
                messageTextBlock.Text = ex.Message;
            }
            finally
            {
                // Set the order in the grid.
                ordersGrid.SelectedItem = currentOrder;
            }
        }
    );
}

참고참고:

OData 웹 사이트에 게시된 Northwind 샘플 데이터 서비스는 읽기 전용이므로 변경 내용을 저장하려고 하면 오류가 반환됩니다. 이 코드 예제를 실행하려면 고유한 Northwind 샘플 데이터 서비스를 만들어야 합니다. 이렇게 하려면 방법: Northwind 데이터 만들기 항목의 단계를 수행합니다.

사용자가 앱을 벗어난 부분을 탐색할 때 일반적으로 앱이 유휴 상태로 전환됩니다. 이 상태에서는 앱이 메모리에 유지되므로 사용자가 앱으로 돌아가면 거의 즉시 계속될 수 있습니다. 이 빠른 앱 전환은 자동으로 사용할 수 있습니다. 하지만 앱이 유휴 상태인 동안 종료될 수도 있습니다. 앱 수명 주기 동안 발생하는 이러한 상태 변경을 처리하도록 앱을 디자인하는 것이 중요합니다. 자세한 내용은 Windows Phone 8의 앱 활성화 및 비활성화를 참조하세요. 종료 시 앱 상태가 손실되지 않게 하려면 앱 수명 주기 동안 발생하는 이벤트의 처리기를 구현할 수 있습니다. 이러한 처리기에서는 앱이 활성 상태와 비활성 상태 간을 전환할 때 DataServiceContext 클래스 및 모든 DataServiceCollection 인스턴스의 상태를 저장하고 복원할 수 있습니다. 이러한 두 개체를 직렬화하면 데이터 서비스로 전송되지 않은 미디어 리소스 스트림을 비롯하여 추적된 엔터티 개체나 관련 엔터티 개체도 모두 직렬화됩니다. 컬렉션 자체가 복원되면 중첩된 컬렉션 간의 관계도 복원됩니다. 이 동작은 실행이 종료된 경우에도 앱이 계속 실행되는 것처럼 사용자에게 표시되는 환경을 만듭니다.

Windows Phone 용 OData 클라이언트에는 이러한 상태 전환을 관리하는 데 사용되는 DataServiceState 클래스가 있습니다. 이러한 상태 관리 이벤트는 기본 앱의 코드 숨김 페이지에서 처리됩니다. 다음 표에서는 Windows Phone 상태 변경과 각 상태 변경에 DataServiceState 클래스를 사용하는 방법을 보여 줍니다.

페이지를 비활성화하거나 페이지에서 밖으로 이동할 때는 DataServiceState 클래스에서 Serialize(DataServiceContext, Dictionary<String, Object>) 메서드를 호출하여 DataServiceContext 인스턴스를 전달합니다. 선택적으로 관련 컬렉션의 그래프를 포함하여 명명된 DataServiceCollection 인스턴스를 포함하는 Dictionary<TKey, TValue> 개체를 전달할 수 있습니다. 다음 예제에서는 페이지 상태에 저장된 컨텍스트 및 컬렉션 데이터의 직렬화를 보여 줍니다.

// Define a dictionary to hold an existing DataServiceCollection<Customer>. 
var collections = new Dictionary<string, object>();
collections.Add("Customers", customers);

// Serialize the data service data into the state dictionary.      
this.State["DataServiceState"] = 
   DataServiceState.Serialize(context, collections);

직렬화되고 저장된 DataServiceState가 상태 사전에서 검색됩니다. 페이지를 활성화하거나 페이지로 이동할 때는 DataServiceState 인스턴스에서 Deserialize(String) 메서드를 호출합니다. 이 메서드는 저장된 DataServiceContext 인스턴스 및 명명된 DataServiceCollection 인스턴스를 포함하는 저장된 모든 Dictionary<TKey, TValue> 개체를 반환합니다. 다음 예제에서는 저장된 데이터 서비스 상태 데이터의 역직렬화를 보여 줍니다.

object storedState;
DataServiceState state;

// Get the serialized data service state.
if (this.State.TryGetValue("DataServiceState", out storedState))
{
    // Deserialize the DataServiceState object.
    state = DataServiceState.Deserialize(storedState as string);

    // Set the context from the stored object.
    context = (NorthwindEntities)state.Context;

    // Set the binding collections from the stored collection.
    customers = state.RootCollections["Customers"] as DataServiceCollection<Customer>;
}

팁팁:

추적된 엔터티 개체를 상태 사전에 직접 저장하려고 하면 직렬화 과정에서 오류가 발생할 수 있습니다. 추적된 개별 개체의 상태를 유지해야 하는 경우 엔터티의 URI를 대신 저장합니다. TryGetUri(Object, Uri) 메서드를 호출하여 엔터티 개체의 URI를 가져올 수 있습니다. 나중에 저장된 URI를 TryGetEntity``1(Uri, UMP) 메서드에 전달하여 복원된 DataServiceContext에서 개체를 검색할 수 있습니다.

자세한 내용은 Windows Phone 8용 OData 클라이언트의 상태를 유지하는 방법를 참조하세요.

앱에 대해 MVVM 디자인 패턴을 구현하는 경우 뷰 모델 자체에서 데이터 서비스 상태를 직렬화 및 역직렬화하는 것이 좋습니다. 자세한 내용은 연습: Windows Phone 8의 OData(MVVM 포함) 사용을 참조하세요.

Windows Phone 의 OData 클라이언트 라이브러리를 사용하면 요청 시 데이터 서비스에 제공되는 자격 증명을 지정할 수 있습니다. 이렇게 하려면 ICredentials 인터페이스를 구현하는 개체(예: NetworkCredential)를 DataServiceContextCredentials() 속성에 할당합니다.

보안 참고보안 참고:

사용자 자격 증명은 실행 중에만 요청해야 하고 캐시하면 안 됩니다. 자격 증명은 항상 안전한 곳에 저장해야 합니다.

다음 코드 줄에서는 이 DataServiceContext 인스턴스를 사용하여 데이터 서비스에 대한 요청의 자격 증명을 설정합니다.

context.Credentials = 
    new NetworkCredential(userName, password, domain);

자격 증명 속성은 기본, 다이제스트, Windows 인증과 같은 비밀번호 기반의 인증 체계를 지원합니다.

보안 참고보안 참고:

기본 및 다이제스트 인증을 사용하여 전송된 데이터는 암호화되지 않으므로 악의적 사용자가 데이터를 볼 수 있습니다. 또한 기본 인증 자격 증명(사용자 이름 및 비밀번호)은 일반 텍스트로 전송되며 차단될 수 있습니다.

다른 클레임 기반 인증 메커니즘(예: OAuth 2.0)을 사용하여 Windows Phone 앱을 인증할 수도 있습니다. 이러한 클레임 기반 인증 체계를 사용하는 경우 특정 클레임 공급자에 필요한 헤더를 수동으로 설정해야 합니다. 요청 헤더에 액세스하고 수정하려면 DataServiceContext에서 발생된 SendingRequest() 이벤트를 처리해야 합니다. OAuth 2.0 보호 OData 서비스에 연결 게시물에서는 Windows Azure AppFabric의 ACS(Access Control Services)를 사용하여 인증되는 Windows Phone 앱에 대해 이 작업을 수행하는 방법을 보여 줍니다. OData 서비스의 인증에 대한 보다 일반적인 내용은 WCF Data Services에 보안 설정을 참조하세요.

Windows Phone 의 OData 클라이언트 라이브러리는 Atom 형식의 HTTP 메시지를 사용하여 OData 서비스와 통신합니다. Atom은 XML 기반 형식이므로 다른 OData 지원 형식인 JSON(JavaScript Object Notation) 형식을 사용하여 서식이 지정된 동일한 메시지보다 많은 대역폭이 메시지에 필요합니다. Windows Phone 의 OData 클라이언트 라이브러리는 JSON 형식을 지원하지 않지만 gzip 압축 등의 HTTP 압축 구성을 사용하여 네트워크 대역폭 요구 사항을 줄일 수 있습니다. 데이터 서비스에서 응답을 압축하도록 요청하거나 POST 요청이 압축됨을 나타내도록 Accept-Encoding HTTP 메시지 헤더를 설정합니다. 이 헤더의 값은 요청된 압축 구성의 이름으로 설정됩니다.

중요중요:

메시지 압축은 데이터 서비스와 Windows Phone 단말기 간의 통신을 위한 네트워크 사용을 줄입니다. 하지만 이와 동시에 데이터 서비스와 단말기에서 모두 처리 리소스를 추가로 사용합니다. 이러한 추가 처리는 통신의 전체 성능과 단말기의 배터리 수명에 영향을 줄 수 있습니다.

클라이언트는 처리 시 압축을 지원하는 OData 서비스에 대해 요청을 압축하고 응답의 압축을 풀 수 있도록 하는 다음 이벤트를 제공합니다.

ReadingResponse()

이 이벤트는 데이터 서비스로부터 응답을 받은 후 메시지를 읽기 전에 발생합니다. 이 이벤트를 처리하여 응답이 압축되었는지 확인하고 필요한 경우 응답의 압축을 풉니다.

WritingRequest()

이 이벤트는 HTTP 요청이 생성되기 전에 발생합니다. 이 이벤트를 처리하여 압축된 응답을 요청하거나 메시지 본문을 압축하도록 Accept-Encoding 헤더를 설정합니다.

이러한 이벤트를 처리할 때 제공된 ReadingWritingHttpMessageEventArgs에서 메시지 헤더와 메시지 본문에 모두 액세스할 수 있습니다. 메시지 헤더는 Headers() 속성에서 반환된 문자열 값의 사전에서 액세스됩니다. 메시지 본문은 Content() 속성에서 스트림으로 액세스됩니다. 자세한 내용은 OData 압축에 대한 이 게시물을 참조하세요.

중요중요:

Windows Phone SDK에는 압축에 대한 지원이 포함되어 있지 않습니다. 압축을 구현하려면 Windows Phone 을 지원하는 타사 압축 라이브러리를 사용해야 합니다. 또한 OData 서비스를 호스트하는 웹 서버에서 요청된 압축 구성을 사용하도록 설정해야 합니다.

표시: