参数筛选器

本示例演示如何在调用方法之前验证传递给方法的参数。定义了 ParameterFilterAttributeParameterFilterBehavior 以便可以将筛选器应用于方法,可以对传递给该方法的参数施加约束。

提示

本主题的最后介绍了此示例的设置过程和生成说明。

该服务实现定义“请求-答复”通信模式的协定。该协定由 ICalculator 接口定义,此接口公开了数学运算(加、减、乘、除)。

 // 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);
 }

客户端向某个数学运算发出同步请求,服务使用结果进行回复。

在服务中,ParameterFilterBehavior 类实现 IParameterInspector 接口。实现了接口的 BeforeCall 方法,以便在调用方法之前验证参数。

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;
    }
}

ParameterFilter 应用于 Multiply 方法上,如下面的示例代码所示:

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

运行示例时,操作请求和响应将显示在客户端控制台窗口中。在本示例中,向服务提交两个运算。第一个乘法运算的输入值在 1 到 10 之间,因此运算成功。第二个乘法运算的输入值超出范围,因此将错误发送回客户端,以指示参数超出范围。

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

Press <ENTER> to terminate client.

设置、生成和运行示例

  1. 请确保已经执行了 Windows Communication Foundation 示例的一次性安装过程

  2. 若要生成解决方案,请按照生成 Windows Communication Foundation 示例中的说明进行操作。

  3. 若要用单机配置或跨计算机配置来运行示例,请按照运行 Windows Communication Foundation 示例中的说明进行操作。

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