Поделиться через


Операции и перехватчики службы (платформа служб данных 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, который указывает, что возвращаемое из метода значение является отдельной сущностью, а не коллекцией сущностей. Это различие определяет результирующую сериализацию ответа. Например, при использовании сериализации AtomPub отдельный экземпляр типа ресурса представлен в качестве элемента entry, а набор экземпляров — в качестве элемента feed.

Если метод не следует определенным выше соглашениям, то он не будет представлен в качестве операции службы в службе данных.

Адресация операций службы

Согласно спецификации протокола службы данных ADO.NET для адресации операций службы имя метода помещается в первый сегмент пути URI. Дополнительные сегменты пути или параметры запросов добавляются в URI в зависимости от типа возвращаемого значения операции службы.

Допустимые типы возвращаемых значений Правила URI

Void

Допускается отдельный сегмент пути, представляющий собой имя операции службы.

Системные параметры запросов не допускаются.

IEnumerable<T>

Допускается отдельный сегмент пути, представляющий собой имя операции службы.

Системные параметры запросов не допускаются.

IQueryable<T>

Допускаются дополнительные сегменты пути URI согласно правилам формирования пути в спецификации Спецификации служб данных ADO.NET.

Допускаются системные параметры запросов.

Добавление операций службы

В приведенном ниже примере показана реализация операции службы в службе данных, предоставляющей модель на платформе 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)

Другие ресурсы

Модель EDM