OData 동작을 사용하여 서버 쪽 동작 구현
Open Data Protocol(OData)을 사용하면 데이터 서비스에 대해 서비스 동작을 정의할 수 있습니다. 서비스 동작은 데이터 서비스에 대해 정의되는 특별한 동작입니다. 서비스 동작을 사용하면 데이터 중심적인 모델에 동작을 삽입할 수 있습니다. 서비스 동작을 사용하면 논리를 제공된 리소스에 바인딩해야 하는 OData에서 비즈니스 논리를 호출할 수 있습니다. 서비스 동작은 다음과 같이 일반적인 끝점 기반의 서비스 동작과 다릅니다.
리소스에 바인딩됨
고정된 끝점에 정의되는 서비스 동작과는 달리 서비스 동작은 일반적으로 리소스, 엔터티 집합(피드) 또는 개별 엔터티에 바인딩됩니다. 이러한 리소스를 바인딩 매개 변수라고 합니다. WCF Data Services에서 바인딩 매개 변수는 엔터티 형식 또는 엔터티 형식의 컬렉션만 될 수 있습니다. 바인딩이 아닌 매개 변수도 서비스 동작에 제공할 수 있습니다. 하지만 이러한 매개 변수는 기본 형식, 복합 형식 또는 기본 형식과 복합 형식의 조합만 가능합니다. 서비스 동작이 리소스에 바인딩되면 서비스 동작이 엔터티 직렬화에 동작 리소스로 노출됩니다.
의도하지 않은 결과 포함
서비스 동작으로 호출되는 비즈니스 논리는 데이터 또는 상태를 변경하거나 다른 일부 비즈니스 프로세스를 호출하는 등 서비스에 영향을 줍니다. 서비스 동작은 항상 의도하지 않은 결과를 포함하므로 POST 요청을 사용해서만 호출할 수 있습니다. 서비스 동작과 달리 바인딩이 아닌 매개 변수는 URI가 아닌 본문 메시지의 서비스 동작에 제공됩니다. 이러한 바인딩이 아닌 매개 변수는 요청의 본문에서 JSON(JavaScript Notation)으로 인코딩된 값으로 제공됩니다.
추가로 구성할 수 없음
서비스 동작은 서비스 동작과 동일한 반환 형식을 사용할 수 있습니다. 하지만 서비스 동작과 달리 서비스 동작은 추가로 구성할 수 없습니다. 즉, 시스템 쿼리 옵션을 서비스 동작에 적용할 수 없습니다.
디지털 영화를 리소스로 가정해 보겠습니다. 체크 아웃, 등급/코멘트 또는 체크인 등 디지털 영화로 수행할 수 있는 동작이 많이 있습니다. 이러한 동작은 디지털 영화를 관리하는 WCF Data Service로 구현할 수 있는 동작의 예입니다. 동작은 동작을 호출할 수 있는 리소스를 포함하는 OData 응답에 설명되어 있습니다. 사용자가 디지털 영화를 나타내는 리소스를 요청하면 WCF Data Service에서 반환된 응답은 해당 리소스에서 사용할 수 있는 동작에 대한 정보를 포함합니다. 동작의 사용 가능 여부는 데이터 서비스 또는 리소스의 상태에 따라 달라질 수 있습니다. 예를 들어 디지털 영화를 체크 아웃하면 다른 사용자가 이 디지털 영화를 체크 아웃할 수 없습니다. 클라이언트는 URL을 지정하기만 하면 동작을 호출할 수 있습니다. 예를 들어 http://MyServer/MovieService.svc/Movies(6)는 특정 디지털 영화를 식별하고 http://MyServer/MovieService.svc/Movies(6)/Checkout은 특정 영화에서 동작을 호출합니다. 동작을 사용하여 데이터 모델을 노출하지 않고 서비스 모델을 노출할 수 있습니다. 영화 서비스를 계속 예로 들자면 사용자가 영화의 평점을 매길 수 있도록 하지만 등급 데이터를 리소스로 직접적으로 노출하지 않도록 할 수 있습니다. 사용자가 영화에 대한 평점을 매길 수 있지만 평가 데이터를 리소스로 직접 액세스하지 않도록 평가 동작을 구현할 수 있습니다.
동작 구현
서비스 동작을 구현하려면 IServiceProvider, IDataServiceActionProvider와 IDataServiceInvokable 인터페이스를 구현해야 합니다. IServiceProvider를 사용하여 WCF Data Services를 통해 IDataServiceActionProvider를 구현할 수 있습니다. IDataServiceActionProvider를 사용하여 WCF Data Services를 통해 서비스 동작을 만들고 찾고 설명하고 호출할 수 있습니다. IDataServiceInvokable을 사용하여 서비스 동작의 동작을 구현하고 결과(있는 경우)를 가져오는 코드를 호출할 수 있습니다. WCF Data Services가 Per-Call WCF Services이고 서비스를 호출할 때마다 서비스의 새 인스턴스가 만들어진다는 점에 주의합니다. 서비스를 만들 때 불필요한 동작이 수행되지 않는지 확인합니다.
IServiceProvider
IServiceProvider는 GetService(Type)라는 메서드를 포함합니다. 이 메서드는 WCF Data Services에 의해 호출되어 메타데이터 서비스 공급자 및 데이터 동작 공급자를 비롯하여 여러 서비스 공급자를 가져옵니다. 데이터 서비스 동작 공급자가 요청되면 IDataServiceActionProvider 구현을 반환합니다.
IDataServiceActionProvider
IDataServiceActionProvider에는 사용 가능한 동작에 대한 정보를 검색하는 데 사용할 수 있는 메서드가 들어 있습니다. IDataServiceActionProvider를 구현하는 경우 동작을 사용하여 IDataServiceMetadataProvider의 서비스 구현으로 정의되는 서비스에 대한 메타데이터를 확장하고 해당 동작에 대한 디스패치를 적절히 처리합니다.
AdvertiseServiceAction
특정 리소스에 사용할 수 있는 동작을 확인하기 위해 AdvertiseServiceAction(DataServiceOperationContext, ServiceAction, Object, Boolean, ODataAction%)이 호출됩니다. 이 메서드는 항상 사용할 수 있는 것은 아닌 동작에 대해서만 호출됩니다. 요청 중인 리소스 상태 또는 서비스의 상태를 기반으로 하는 OData 응답에 동작을 포함해야 하는지 여부를 확인할 때 사용됩니다. 이를 확인하는 방법은 전적으로 사용자의 재량에 따라 결정됩니다. 가용성을 계산하는 비용이 높거나 현재 리소스가 피드에 있는 경우 확인을 건너뛰고 동작을 알려도 됩니다. 반환 중인 현재 리소스가 피드의 일부인 경우 inFeed 매개 변수가 true로 설정됩니다.
CreateInvokable
동작의 동작을 구현하는 코드를 캡슐화하는 대리자를 포함하는 IDataServiceInvokable을 만들기 위해 CreateInvokable(DataServiceOperationContext, ServiceAction, array<Object[])이 호출됩니다. 이 서비스는 IDataServiceInvokable 인스턴스를 만들지만 동작을 호출하지는 않습니다. WCF Data Service 동작은 의도하지 않은 결과를 포함할 수 있고 이러한 변경 내용을 디스크에 저장하도록 업데이트 공급자와 함께 사용해야 합니다. Invoke() 메서드는 업데이트 공급자에서 호출되는 SaveChanges()메서드에서 호출됩니다.
GetServiceActions
이 메서드는 WCF Data Service가 노출하는 모든 동작을 나타내는 ServiceAction 인스턴스의 컬렉션을 반환합니다. ServiceAction은 동작의 메타데이터 표현으로 동작 이름, 동작 매개 변수 및 동작의 반환 형식과 같은 정보를 포함합니다.
GetServiceActionsByBindingParameterType
이 메서드는 특정 바인딩 매개 변수 형식에 바인딩할 수 있는 모든 ServiceAction 인스턴스의 컬렉션을 반환합니다. 즉, 특정 리소스 형식(또는 바인딩 매개 변수 형식이라고도 함)에 대해 작동할 수 있는 모든 ServiceAction이며 서비스가 해당 리소스에 대해 호출할 수 있는 동작에 대한 정보를 포함하기 위해 리소스를 반환하는 경우 사용됩니다. 이 메서드는 파생된 형식이 아닌 정확한 바인딩 매개 변수 형식을 바인딩할 수 있는 동작만 반환해야 합니다. 이 메서드는 발생하는 형식 당 요청마다 한 번만 호출되며 결과는 WCF Data Services에서 캐시합니다.
TryResolveServiceAction
이 메서드는 지정된 ServiceAction을 검색하고 ServiceAction을 발견한 경우 true를 반환합니다. 찾은 경우 serviceAction out 매개 변수에서 ServiceAction이 반환됩니다.
IDataServiceInvokable
이 인터페이스는 WCF Data Service 동작을 실행하는 방법을 제공합니다. IDataServiceInvokable을 구현하는 경우 다음 세 가지 작업을 수행해야 합니다.
매개 변수를 캡처하고 잠재적으로 마샬링합니다.
Invoke()가 호출될 때 동작을 실제로 구현하는 코드에 매개 변수를 디스패치합니다.
GetResult()를 사용하여 결과를 검색할 수 있도록 Invoke()에서 결과를 저장합니다.
매개 변수를 토큰으로 전달할 수 있습니다. 이는 실제 동작에 디스패치하기 전에 이러한 토큰을 실제 리소스로 변환(마샬링)해야 할 수 있는 경우 리소스를 나타내는 토큰과 함께 작동하는 데이터 서비스 공급자를 쓸 수 있기 때문입니다. 매개 변수를 마샬링한 후 동작이 호출될 때 발생하는 리소스에 대한 변경 내용을 디스크에 저장하고 쓸 수 있도록 매개 변수가 편집 가능한 상태여야 합니다.
이 인터페이스에는 Invoke 및 GetResult의 두 가지 메서드가 필요합니다. Invoke는 동작의 동작을 구현하는 대리자를 호출하고 GetResult는 동작의 결과를 반환합니다.
서비스 동작 액세스 제어
WCF Data Services에서 서비스 동작의 서비스 전반적인 가시성은 SetServiceOperationAccessRule(String, ServiceOperationRights) 메서드를 사용하여 서비스 동작의 가시성을 제어하는 것과 동일한 방식으로 IDataServiceConfiguration 클래스의 SetServiceActionAccessRule(String, ServiceActionRights) 메서드에 의해 제어됩니다.
서비스 동작의 메타데이터 정의
서비스 동작과 마찬가지로 서비스 동작은 서비스 메타데이터에서 FunctionImport 요소로 정의됩니다. 서비스 동작 FunctionImport에는 바인딩 매개 변수 및 바인딩이 아닌 매개 변수를 모두 나타내는 0개 이상의 Parameter 요소가 포함됩니다. 또한 FunctionImport의 다음 특성은 서비스 동작의 동작을 정의합니다.
IsSideEffecting
서비스 동작은 항상 의도하지 않은 결과를 포함할 수 있으므로 이 특성은 항상 true입니다.
IsBindable
서비스 동작은 일반적으로 리소스에 바인딩되지만 항상 그런 것은 아닙니다. 이 특성이 true인 경우 첫 번째 매개 변수는 엔터티 형식 또는 엔터티 컬렉션이어야 합니다.
IsComposable
서비스 동작이 추가 쿼리 구성을 지원하지 않을 경우 이 특성은 항상 false입니다.
WCF Data Service 동작 호출
동작은 HTTP POST 요청을 사용하여 호출됩니다. URL은 뒤에 동작 이름이 오늘 리소스를 지정합니다. 요청 본문에서 매개 변수가 전달됩니다. 예를 들어 Rate라는 동작을 노출한 MovieService라는 서비스가 있는 경우입니다. 다음 URL을 사용하여 특정 영화에서 Rate 동작을 호출할 수 있습니다.
http://MovieServer/MovieService.svc/Movies(1)/Rate
Movies(1)은 평점을 매길 영화를 지정하고 Rate는 Rate 동작을 지정합니다. 등급의 실제 값은 다음 예에서와 같이 HTTP 요청의 본문에 있습니다.
POST http://MovieServer/MoviesService.svc/Movies(1)/Rate HTTP/1.1
Content-Type: application/json
Content-Length: 20
Host: localhost:15238
{
"rating": 4
}
경고
위의 샘플 코드는 JSON 경량 버전을 지원하는 WCF Data Services 5.2 이상에서만 작동합니다.이전 버전의 WCF Data Services를 사용할 경우 application/json;odata=verbose와 같이 자세한 JSON 콘텐츠 형식을 지정해야 합니다.
또는 다음 코드 조각에서와 같이 WCF Data Services 클라이언트를 사용하는 동작을 호출할 수 있습니다.
MoviesModel context = new MoviesModel (new Uri("http://MyServer/MoviesService.svc/"));
//...
context.Execute(new Uri("http://MyServer/MoviesService.svc/Movies(1)/Rate"), "POST", new BodyOperationParameter("rating",4) );
위의 코드 조각에서 MoviesModel 클래스는 Visual Studio를 사용하여 서비스 참조를 WCF Data Service에 추가하여 생성되었습니다.
참고 항목
개념
사용자 지정 데이터 서비스 공급자(WCF Data Services)