다음을 통해 공유


서비스 작업 및 인터셉터(ADO.NET 데이터 서비스 프레임워크)

ADO.NET 데이터 서비스를 사용하면 서비스 작업 및/또는 인터셉터를 정의하여 URI와 리소스 간 매핑 모델을 확장할 수 있습니다.

데이터 서비스에 비즈니스 논리 추가

서비스 작업은 비즈니스 논리가 반드시 필요한 경우, 예를 들어 유효성 검사 논리나 보안을 구현하려는 경우에 사용할 수 있습니다. 개발자는 서비스 작업을 통해 서버에 메서드를 정의할 수 있으며, 이러한 메서드는 ADO.NET 데이터 서비스의 다른 리소스처럼 URI로 식별됩니다. 이와 같은 서비스 작업은 데이터 서비스를 나타내는 DataService에서 파생된 클래스에 추가된 메서드입니다.

서비스 작업 만들기

서비스 작업을 구현하려면 데이터 서비스를 나타내는 DataService 클래스에서 파생된 데이터 서비스 클래스의 일부로 공용 인스턴스 메서드를 정의해야 합니다.

  • 메서드는 [in] 매개 변수만 허용해야 합니다.

    • 매개 변수를 정의할 때 각 매개 변수의 형식은 기본 형식으로 정의해야 합니다.
  • 메서드가 void, IEnumerable<T>, IQueryable<T>, T를 반환하거나 정수 또는 문자열 같은 기본 클래스를 반환해야 합니다.

    • T는 데이터 모델에서 데이터 서비스로 노출되는 엔터티 형식을 나타내는 클래스여야 합니다.

    • 정렬, 페이징, 필터링 등의 쿼리 옵션을 지원할 수 있도록 서비스 작업 메서드가 **IQueryable<T>**를 반환해야 합니다.

  • 메서드에 [WebGet] 또는 [WebInvoke] 특성이 주석으로 추가되어야 합니다.

    • [WebGet]은 GET 요청을 사용한 메서드 호출을 지원합니다.

    • [WebInvoke]는 PUT, POST 또는 DELETE 요청을 사용한 메서드 호출을 지원합니다.

  • 메서드의 반환 값이 엔터티 컬렉션이 아니라 단일 엔터티가 되도록 지정하는 SingleResultAttribute를 서비스 작업에 주석으로 추가할 수도 있습니다. 이는 응답 결과가 serialization된다는 것을 나타냅니다. 예를 들어 AtomPub serialization을 사용할 경우 단일 리소스 형식 인스턴스는 entry 요소로 나타나고 인스턴스 집합은 feed 요소로 나타납니다.

위에 정의된 규칙을 따르지 않을 경우 메서드가 데이터 서비스 내의 서비스 작업으로 노출되지 않습니다.

서비스 작업 주소 지정

ADO.NET 데이터 서비스 프로토콜 사양에 따라 서비스 작업은 URI의 첫 번째 경로 세그먼트에 메서드 이름을 배치하는 방법으로 지정됩니다. 서비스 작업의 반환 형식에 따라 추가 경로 세그먼트나 쿼리 옵션이 URI에 추가될 수도 있습니다.

유효한 반환 형식 URI 규칙

Void

서비스 작업의 이름에 해당하는 단일 경로 세그먼트가 허용됩니다.

시스템 쿼리 옵션은 허용되지 않습니다.

IEnumerable<T>

서비스 작업의 이름에 해당하는 단일 경로 세그먼트가 허용됩니다.

시스템 쿼리 옵션은 허용되지 않습니다.

IQueryable<T>

ADO.NET 데이터 서비스 사양 사양의 경로 생성 규칙에 따라 추가 URI 경로 세그먼트가 허용됩니다.

시스템 쿼리 옵션이 허용됩니다.

서비스 작업 추가

다음 예제에서는 Entity Framework 기반 모델을 노출하는 데이터 서비스에 서비스 작업을 구현합니다.

public class Northwind : 
           DataService<NorthwindModel.NorthwindEntities>
{
public static void InitializeService(IDataServiceConfiguration config)
    {
       // Entity sets access configuration.
        config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);

        // Service operations access configuration.
        config.SetServiceOperationAccessRule("OrdersByCity",
                  ServiceOperationRights.All);
        }

    [WebGet]
    public IQueryable<Orders> OrdersByCity(string city)
    {
        if (string.IsNullOrEmpty(city))
        {
            throw new ArgumentNullException("city",
                      "You must provide a city name argument");
        }

        return this.CurrentDataSource.Orders.Where(
            "it.ShipCity = @city", 
            new ObjectParameter("city", city));
    }
}

서비스 작업을 호출하기 위해 다음 URI를 사용합니다.

https://server/Northwind.svc/OrdersByCity?city='London'

서비스 작업의 반환 형식이 **IQueryable<T>**이므로 추가 URI 세그먼트가 허용됩니다. 예를 들어 다음 URI는 유효합니다.

https://server/Northwind.svc/OrdersByCity?city='London'&$top=2
https://server/Northwind.svc/OrdersByCity?city='London'&$top=10&$orderby=OrderID

서비스 작업 액세스 제어

서비스 전반에 걸친 서비스 작업의 표시는 IDataServiceConfiguration 클래스의 메서드에 의해 제어되며 이는 엔터티 집합의 표시가 제어되는 방식과 상당 부분 유사합니다. 예를 들어 위 예제의 CustomersByCity 메서드에 액세스할 수 있도록 다음 그림의 코드가 DataService에서 파생된 클래스에 추가됩니다.

public class Northwind : DataService<NorthwindEntities>
    {
        public static void InitializeService(
                                   IDataServiceConfiguration config)
        {
            config.SetServiceOperationAccessRule("CustomersByCity", 
                                          ServiceOperationRights.All);
        }

        [WebGet]
        public IQueryable<Customer> CustomersByCity(string city)
        {… }
     }

인터셉터

ADO.NET 데이터 서비스를 통해 데이터 서비스 개발자는 요청/응답 파이프라인을 가로채 사용자 지정 유효성 검사 논리를 삽입할 수 있습니다. ADO.NET 데이터 서비스에서 인터셉터는 두 가지 역할을 합니다. 하나는 유효성 검사 논리를 처리 파이프라인에 추가하는 것이고 다른 하나는 사용자 지정 권한 부여 정책을 삽입할 위치를 요청 단위로 제공하는 것입니다.

Note참고

쿼리 인터셉터에는 매개 변수를 사용할 수 없습니다.

요청/URI 처리

데이터 서비스에서 GET 요청을 받으면 요청 URI가 처리되고 데이터 서비스에 정의된 쿼리 가로채기 메서드가 호출됩니다. 다음 예제에서는 주문에 대한 GET 요청을 가로채는 쿼리 인터셉터 메서드 구현을 보여 줍니다. 이 인터셉터는 CustomerID=="AROUT"인 고객에게 할당된 주문만 반환합니다. 이 메서드로 각 사용자에게 할당된 주문을 반환하려면 요청을 보내는 사용자를 인증하기 위한 추가 코드가 필요합니다.

    [QueryInterceptor("Orders")]
    public Expression<Func<Orders, bool>> FilterOrdersByCustomer()
    {
        return o => o.Customers.CustomerID == "AROUT";
    }

참고 항목

개념

데이터 서비스에 대한 확장(ADO.NET 데이터 서비스 프레임워크)
리소스 주소 지정을 위한 URI 형식(ADO.NET 데이터 서비스 프레임워크)

관련 자료

엔터티 데이터 모델