Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Los servicios de datos de ADO.NET habilitan la definición de operaciones y/o interceptores de servicio para ampliar el modelo de URI de asignación a los recursos.
Agregar lógica empresarial a un servicio de datos
Se pueden usar operaciones de servicio cuando se necesite lógica empresarial; por ejemplo, para implementar la lógica o la seguridad de validación. Las operaciones de servicio permiten al programador definir un método en el servidor, que se identifica mediante un URI, como otros recursos de los servicios de datos de ADO.NET. Estas operaciones son métodos agregados a la clase derivada de DataService que represente el servicio de datos.
Crear operaciones de servicio
Para implementar una operación de servicio, defina un método de instancia pública como parte de la clase del servicio de datos derivada de la clase DataService que representa el servicio de datos.
El método sólo debe aceptar parámetros
[in].- Si se definen parámetros, el tipo de cada parámetro debe ser un tipo primitivo.
El método debe devolver el valor de tipo void, IEnumerable<T>, IQueryable<T>, T o una clase primitiva como un entero o una cadena.
T DEBE ser una clase que represente un tipo de entidad en el modelo de datos que expone el servicio de datos.
Para admitir opciones de consulta como ordenaciones, paginaciones y filtrados, los métodos de la operación de servicio deben devolver IQueryable<T>.
El método se debe anotar con el atributo
[WebGet]o[WebInvoke].[WebGet]permite invocar el método utilizando una solicitud GET.[WebInvoke]permite invocar el método utilizando una solicitud PUT, POST o DELETE.
Una operación de servicio se puede anotar con el elemento SingleResultAttribute que especifica que el valor devuelto desde el método es una sola entidad en vez de una colección de entidades. Esta distinción dicta la serialización resultante de la respuesta. Por ejemplo, cuando use la serialización AtomPub, una sola instancia de tipo de recurso se representa como elemento de entrada y un conjunto de instancias como elemento feed.
Si un método no sigue las convenciones definidas anteriormente, no se expondrá como operación de servicio en el servicio de datos.
Direccionamiento de las operaciones de servicio
Según la especificación del protocolo de servicios de datos de ADO.NET, las operaciones de servicio las direcciona la colocación del nombre del método en el primer segmento de la ruta de acceso de un URI. Se pueden agregar segmentos de ruta de acceso u opciones de consulta adicionales al URI en función del tipo de valor devuelto de la operación de servicio.
| Tipos de valores devueltos válidos | Reglas de URI |
|---|---|
Void |
Se permite un solo segmento de ruta de acceso que sea el nombre de la operación de servicio. No se permiten las opciones de consulta del sistema. |
IEnumerable<T> |
Se permite un solo segmento de ruta de acceso que sea el nombre de la operación de servicio. No se permiten las opciones de consulta del sistema. |
IQueryable<T> |
Se permiten segmentos de ruta de acceso del URI adicionales según las reglas de creación de rutas de acceso de la especificación Especificaciones del servicio de datos de ADO.NET. Se permiten las opciones de consulta del sistema. |
Agregar operaciones de servicio
El siguiente ejemplo implementa una operación de servicio en un servicio de datos que expone un modelo basado en 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));
}
}
Para invocar la operación de servicio, se usa el URI siguiente:
https://server/Northwind.svc/OrdersByCity?city='London'
Puesto que el tipo de valor devuelto de la operación de servicio es IQueryable<T>, se permiten segmentos de URI adicionales. Por ejemplo, los siguientes URI son válidos:
https://server/Northwind.svc/OrdersByCity?city='London'&$top=2
https://server/Northwind.svc/OrdersByCity?city='London'&$top=10&$orderby=OrderID
Control de acceso a las operaciones de servicio
Un método de la clase IDataServiceConfiguration controla la visibilidad de todo el servicio de las operaciones de servicio de la misma forma que se controla la visibilidad del conjunto de entidades. Por ejemplo, para que se pueda tener acceso al método CustomersByCity del ejemplo anterior, el código de la siguiente ilustración se agrega a la clase derivada de DataService.
public class Northwind : DataService<NorthwindEntities>
{
public static void InitializeService(
IDataServiceConfiguration config)
{
config.SetServiceOperationAccessRule("CustomersByCity",
ServiceOperationRights.All);
}
[WebGet]
public IQueryable<Customer> CustomersByCity(string city)
{… }
}
Interceptores
Los servicios de datos de ADO.NET permiten que un programador del servicio de datos intercepte la canalización de solicitud/respuesta e inserte lógica de validación personalizada. En los servicios de datos de ADO.NET, los interceptores tienen una doble función: permiten que la lógica de validación se agregue a la canalización de procesamiento y proporcionan un lugar de inserción de una directiva de autorización personalizada por solicitud.
Nota |
|---|
Los interceptores de consulta no pueden tomar parámetros. |
Procesamiento de solicitud/URI
Cuando un servicio de datos recibe una solicitud GET, el URI de la solicitud se procesa y se llama a cualquier método de intercepción de consulta definido en el servicio de datos. El siguiente ejemplo muestra la implementación de un método de interceptor de consulta que intercepta la solicitud GET en los pedidos. Este interceptor sólo devuelve pedidos asignados al cliente donde CustomerID=="AROUT". Se necesitaría más código para autenticar al usuario que envía la solicitud a fin de que este método devolviese los pedidos asignados a cada usuario.
[QueryInterceptor("Orders")]
public Expression<Func<Orders, bool>> FilterOrdersByCustomer()
{
return o => o.Customers.CustomerID == "AROUT";
}
Vea también
Conceptos
Extensiones para los servicios de datos (marco de trabajo de los servicios de datos de ADO.NET)
Formato de URI de los recursos de direccionamiento (marco de trabajo de los servicios de datos de ADO.NET)
Nota