参数筛选器
本示例演示如何在调用方法之前验证传递给方法的参数。定义了 ParameterFilterAttribute
和 ParameterFilterBehavior
以便可以将筛选器应用于方法,可以对传递给该方法的参数施加约束。
提示
本主题的最后介绍了此示例的设置过程和生成说明。
该服务实现定义“请求-答复”通信模式的协定。该协定由 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.
设置、生成和运行示例
若要生成解决方案,请按照生成 Windows Communication Foundation 示例中的说明进行操作。
若要用单机配置或跨计算机配置来运行示例,请按照运行 Windows Communication Foundation 示例中的说明进行操作。
Send comments about this topic to Microsoft.
© 2007 Microsoft Corporation. All rights reserved.