Operazioni di servizio e intercettori (framework di ADO.NET Data Services)

ADO.NET Data Services consente di definire operazioni di servizio e/o intercettori per estendere il modello di esecuzione del mapping degli URI alle risorse.

Aggiunta della logica di business a un servizio dati

Quando è necessaria la logica di business, ad esempio per implementare la logica di convalida o sicurezza, è possibile utilizzare le operazioni del servizio. Le operazioni del servizio consentono allo sviluppatore di definire un metodo nel server che, analogamente alle altre risorse ADO.NET Data Service, è identificato da un URI. Queste operazioni di servizio sono metodi aggiunti alla classe derivata da DataService che rappresenta il servizio dati.

Creazione di operazioni di servizio

Per implementare un'operazione di servizio, definire un metodo di istanza pubblica come parte della classe del servizio dati derivata dalla classe DataService che rappresenta il servizio dati.

  • Il metodo deve accettare solo parametri [in].

    • Se sono definiti parametri, il tipo di ogni parametro deve essere primitivo.
  • Il metodo deve restituire void, IEnumerable<T>, IQueryable<T>, T o una classe primitiva, ad esempio un numero intero o una stringa.

    • T DEVE essere una classe che rappresenta un tipo di entità nel modello di dati esposto dal servizio dati.

    • Per supportare opzioni query di ordinamento, paging e filtro, i metodi dell'operazione del servizio devono restituire IQueryable<T>.

  • Il metodo deve essere annotato con l'attributo [WebGet] o [WebInvoke].

    • [WebGet] attiva il metodo richiamato tramite una richiesta GET.

    • [WebInvoke] attiva il metodo richiamato tramite una richiesta PUT, POST o DELETE.

  • Un'operazione del servizio può essere annotata con SingleResultAttribute che specifica che il valore restituito dal metodo è un'entità singola anziché un insieme di entità. Questa distinzione determina la serializzazione della risposta risultante. Nel caso di utilizzo della serializzazione AtomPub, ad esempio, un'istanza singola del tipo di risorsa viene rappresentata come elemento entry e un set di istanze come elemento feed.

Se un metodo non segue le convenzioni sopra definite, non verrà esposto come operazione di servizio all'interno del servizio dati.

Indirizzamento di operazioni di servizio

Sulla base della specifica del protocollo per servizi dati ADO.NET Data Service, le operazioni del servizio vengono indirizzate posizionando il nome del metodo nel primo segmento di percorso di un URI. A seconda del tipo restituito di operazione del servizio, è possibile aggiungere all'URI segmenti di percorso o opzioni query aggiuntive.

Tipi restituiti validi Regole URI

Void

È consentito un solo segmento di percorso che è il nome dell'operazione del servizio.

Non sono consentite le opzioni query del sistema.

IEnumerable<T>

È consentito un solo segmento di percorso che è il nome dell'operazione del servizio.

Non sono consentite le opzioni query del sistema.

IQueryable<T>

Sono consentiti segmenti di percorso URI aggiuntivi in base alle regole di costruzione di percorso specificate in Specifiche di ADO.NET Data Service.

Sono consentite le opzioni query del sistema.

Aggiunta di operazioni di servizio

Nell'esempio seguente viene implementata un'operazione del servizio su un servizio dati che espone un modello basato su 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));
    }
}

Per richiamare l'operazione del servizio, viene utilizzato l'URI seguente:

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

Poiché il tipo restituito dell'operazione del servizio è IQueryable<T>, sono consentiti segmenti URI aggiuntivi. Sono validi, ad esempio, gli URI seguenti:

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

Controllo di accesso ad operazioni di servizio

La visibilità a livello di servizio delle operazioni di servizio viene controllata da un metodo sulla classe IDataServiceConfiguration in modo analogo al controllo della visibilità dei set di entità. Per rendere accessibile il metodo CustomersByCity dell'esempio precedente, viene, ad esempio, aggiunto il codice nella figura seguente alla classe derivata da DataService.

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

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

Intercettori

ADO.NET Data Services consente agli sviluppatori di servizi dati di intercettare la pipeline di richiesta/risposta e inserire logica di convalida personalizzata. In ADO.NET Data Services, gli intercettori svolgono un duplice ruolo: consentono di aggiungere logica di convalida alla pipeline dell'elaborazione e forniscono una posizione per inserire criteri di autorizzazione personalizzati per ogni richiesta.

NoteNota

Gli intercettori di query non possono accettare parametri.

Elaborazione di richiesta/URI

Quando una richiesta GET viene ricevuta da un servizio dati, viene elaborato l'URI di richiesta e chiamato qualsiasi metodo di intercettazione di query definito sul servizio dati. Nell'esempio seguente viene illustrata l'implementazione di un metodo di intercettazione query che intercetta la richiesta GET di ordini. Questo intercettore restituisce solo gli ordini assegnati al cliente con CustomerID=="AROUT". Per autenticare l'utente che invia la richiesta in modo che questo metodo restituisca gli ordini assegnati a ogni utente, è necessaria l'aggiunta di codice ulteriore.

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

Vedere anche

Concetti

Estensioni a servizi dati (framework di ADO.NET Data Services)
Formato URI di indirizzamento delle risorse (framework di ADO.NET Data Services)

Altre risorse

Entity Data Model