Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用拦截器验证WCF参数_Wcf_Validation_Service_Parameters - Fatal编程技术网

使用拦截器验证WCF参数

使用拦截器验证WCF参数,wcf,validation,service,parameters,Wcf,Validation,Service,Parameters,我有一个WCF服务,其操作都需要MyServiceRequest参数(或派生类型) 并返回MyServiceResponse(或Dervied类型),即: FindAppointmentRequest、MakeAnPointmentRequest和RegisterResourceRequest扩展了MyServiceRequest,其中包含属性UserName和UserPassword 如果请求中存在错误的用户名/用户密码对,则此方法都不会正确执行 我想创建一个拦截器,它不仅检查给定的用户名/用

我有一个WCF服务,其操作都需要MyServiceRequest参数(或派生类型) 并返回MyServiceResponse(或Dervied类型),即:

FindAppointmentRequest、MakeAnPointmentRequest和RegisterResourceRequest扩展了MyServiceRequest,其中包含属性UserName和UserPassword

如果请求中存在错误的用户名/用户密码对,则此方法都不会正确执行

我想创建一个拦截器,它不仅检查给定的用户名/用户密码对是否正确(这对于IParameterInspector非常简单),而且还返回到扩展MyServiceResponse的ErrorResponse类型的客户机对象


IParameterInspector能否阻止服务执行请求的方法并返回ErrorResponse strightaway?

您可以使用一个方法返回bool(真/假),该方法在上述每个方法的输入处检查您的参数,然后,您可以检查它是否返回true或false,并相应地返回或执行该方法

所以


把这个放在你上面所有的方法里面。。。其中CheckParams是IParameterInspector中验证参数的方法。

IParameterInspector可以通过引发异常来阻止操作的执行。这里有一个例子

定义自定义故障契约:

public class DataAccessFaultContract
{
    public string ErrorMessage { get; set; }
}
然后检查员:

public class InspectorAttribute : Attribute, IParameterInspector, IOperationBehavior
{
    public void AfterCall(string operationName, object[] outputs, object returnValue, object correlationState)
    {

    }

    public object BeforeCall(string operationName, object[] inputs)
    {
        MyServiceRequest request = null;
        if (inputs != null && inputs.Length > 0)
        {
            request = inputs[0] as MyServiceRequest;
        }

        if (request != null && request.Username != "user" && request.Password != "secret")
        {
            var fc = new DataAccessFaultContract{ ErrorMessage = "Invalid user" };
            throw new FaultException<DataAccessFaultContract>(fc);
        }
        return null;
    }

    public void AddBindingParameters(OperationDescription operationDescription, BindingParameterCollection bindingParameters)
    {
    }

    public void ApplyClientBehavior(OperationDescription operationDescription, ClientOperation clientOperation)
    {
    }

    public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation)
    {
        dispatchOperation.ParameterInspectors.Add(this);
    }

    public void Validate(OperationDescription operationDescription)
    {
    }
}
调用服务时,客户端可以检查FaultException:

try
{
    var response = client.FindAppointments(request);
}
catch (FaultException<DataAccessFaultContract> ex)
{
    string errorMessage = ex.Detail.ErrorMessage;
    // ...
}
试试看
{
var response=client.findappoints(请求);
}
捕获(FaultException-ex)
{
字符串errorMessage=ex.Detail.errorMessage;
// ...
}

如何决定MyServiceRequestobject@darindimitrov:正如您所说,客户端可以通过在
catch()
块中提供的代码检查FaultException。但如果我的客户是iPhone呢?我的RESTAPI由iPhone使用,以及它们如何处理iPhone中的FaultException异常。实际上我已经签入iPhone,我看不到我的自定义错误消息!!。你知道为什么会这样吗??
public class InspectorAttribute : Attribute, IParameterInspector, IOperationBehavior
{
    public void AfterCall(string operationName, object[] outputs, object returnValue, object correlationState)
    {

    }

    public object BeforeCall(string operationName, object[] inputs)
    {
        MyServiceRequest request = null;
        if (inputs != null && inputs.Length > 0)
        {
            request = inputs[0] as MyServiceRequest;
        }

        if (request != null && request.Username != "user" && request.Password != "secret")
        {
            var fc = new DataAccessFaultContract{ ErrorMessage = "Invalid user" };
            throw new FaultException<DataAccessFaultContract>(fc);
        }
        return null;
    }

    public void AddBindingParameters(OperationDescription operationDescription, BindingParameterCollection bindingParameters)
    {
    }

    public void ApplyClientBehavior(OperationDescription operationDescription, ClientOperation clientOperation)
    {
    }

    public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation)
    {
        dispatchOperation.ParameterInspectors.Add(this);
    }

    public void Validate(OperationDescription operationDescription)
    {
    }
}
[ServiceContract]
public interface IMyServiceContract
{
    [Inspector]
    [FaultContract(typeof(DataAccessFaultContract))]
    [OperationContract]
    MySeviceResponse FindAppointments(FindAppointmentRequest request);

    ...
}
try
{
    var response = client.FindAppointments(request);
}
catch (FaultException<DataAccessFaultContract> ex)
{
    string errorMessage = ex.Detail.ErrorMessage;
    // ...
}