Операции и перехватчики службы (платформа служб данных 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 перехватчики играют двоякую роль: они позволяют добавлять логику проверки в конвейер обработки запросов и ответов и обеспечивают место для вставки пользовательской политики авторизации для каждого запроса.
Примечание. |
---|
Перехватчики запросов не могут принимать параметры. |
Обработка запроса или 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)