Condividi tramite


Filtro di parametri

Questo esempio dimostra come convalidare i parametri passati a un metodo prima che sia richiamato. ParameterFilterAttribute e ParameterFilterBehavior sono definiti in modo tale che il filtro possa essere applicato a metodi per i quali i vincoli possono essere imposti sui parametri passati al metodo.

Nota

La procedura di installazione e le istruzioni di compilazione per questo esempio si trovano alla fine dell'argomento.

Il servizio implementa un contratto che definisce un modello di comunicazione richiesta/risposta. Il contratto viene definito dall'interfaccia ICalculator che espone operazioni matematiche Add, Subtract, Multiply e Divide (somma, sottrazione, moltiplicazione e divisione).

 // Define a service contract.
 [ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]
 public interface ICalculator
 {
    [OperationContract]
    double Add(double n1, double n2);
    [OperationContract]
    double Subtract(double n1, double n2);
    [OperationContract]
    double Multiply(double n1, double n2);
    [OperationContract]
    double Divide(double n1, double n2);
 }

Il client esegue richieste sincrone a un'operazione matematica e il servizio risponde fornendo il risultato.

Nel servizio, la classe ParameterFilterBehavior implementa l'interfaccia IParameterInspector. Il metodo BeforeCall dell'interfaccia è implementato in modo tale che i parametri vengono convalidati prima che il metodo sia chiamato.

internal class ParameterFilterBehavior : IParameterInspector
{
    double minValue;
    double maxValue;
    public ParameterFilterBehavior(double minValue, double maxValue)
    {
        this.minValue = minValue;
        this.maxValue = maxValue;
    }
    public void AfterCall(string operationName, object[] outputs,  
                          object returnValue, object correlationState)
    {
    }
    public object BeforeCall(string operationName, object[] inputs)
    {
        // validate parameters before call
        foreach (object input in inputs)
        {
            if ((input != null) && (input.GetType() == typeof(double)))
            {
                if ((double)input < minValue || (double)input > maxValue)
                {
                    throw new FaultException("Parameter out of range: " + input.ToString());
                }
            }
        }
        return null;
    }
}

Il ParameterFilter viene applicato sul metodo Multiply come illustrato nel codice di esempio seguente:

[ParameterFilter(MaxValue = 10, MinValue = 1)]
public double Multiply(double n1, double n2)
{
    return n1 * n2;
}

Quando si esegue l'esempio, le richieste e le risposte dell'operazione vengono visualizzate nella finestra della console client. In questo esempio, due operazioni vengono inviate al servizio. Per la prima operazione di moltiplicazione i valori di input sono compresi tra 1 e 10, così l'operazione riesce correttamente. Per la seconda operazione di moltiplicazione i valori sono esterni all'intervallo, così viene restituito un errore al client per indicare che un parametro era esterno all'intervallo.

Multiply(2,5.25) = 10.5
System.ServiceModel.FaultException: Parameter out of range: 81.25

Press <ENTER> to terminate client.

Per impostare, compilare ed eseguire l'esempio

  1. Assicurarsi di avere eseguito la Procedura di installazione singola per gli esempi di Windows Communication Foundation.

  2. Per generare la soluzione, seguire le istruzioni in Generazione degli esempi Windows Communication Foundation.

  3. Per eseguire l'esempio su un solo computer o tra computer diversi, seguire le istruzioni in Esecuzione degli esempi di Windows Communication Foundation.

Send comments about this topic to Microsoft.
© 2007 Microsoft Corporation. All rights reserved.