C# 更改IParameterInspector或IServiceBehavior在服务端输入的操作参数

C# 更改IParameterInspector或IServiceBehavior在服务端输入的操作参数,c#,.net,validation,wcf,C#,.net,Validation,Wcf,我正在通过ipParameterInspector验证我的WCF服务操作,如: class MyParameterInspector : IParameterInspector { public object BeforeCall(string operationName, object[] inputs) { Token token = CarrierHelper.ReadMessageHeader<Token>(); //He

我正在通过
ipParameterInspector
验证我的WCF服务操作,如:

  class MyParameterInspector : IParameterInspector
{ 
    public object BeforeCall(string operationName, object[] inputs)
    {
        Token token = CarrierHelper.ReadMessageHeader<Token>();
        //Here change the operation entered parameters or something else
    }
}
 public string MyOperation()
    {
        //Here I want to read that parameter which manipulate or make in BeforeCall
    }
那么,有没有一种好的方法或解决方法来实现这种方法呢

更多解释:

通过
ipParameterInspector
我们可以为每个操作定义一个ATRIB来检查用户对该操作的访问权限,因此我通过
IOperationBehavior
ipParameterInspector
实现了这一点,因此在
BeforeCall
中检索用户并检查attrib是否为操作权限(操作授权)哪些是静态的作为枚举,但假设每个操作都应该知道如何在资源上运行(资源安全性,行级别安全性)资源是动态的,我不能将它们定义为静态的或硬代码,比如每个用户应该从数据库中读取权限,我认为也可以实现这一点,但我真的不知道如何实现

 public class RemedyBehaviorAttribute : Attribute, IOperationBehavior
{
    public PrimitiveActivity[] PermissionsToCheck { get; set; }
    public RemedyBehaviorAttribute(params PrimitiveActivity[] pi)
    {
        PermissionsToCheck = pi;
    }
    public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
    {
    }

    public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) { }

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

    public void ApplyClientBehavior(OperationDescription operationDescription,
        ClientOperation clientOperation)
    {
        RemedyParameterInspector paramInspector = new RemedyParameterInspector
        {
            Permissions = PermissionsToCheck
        };
        clientOperation.ParameterInspectors.Add(paramInspector);
    }

    public void ApplyDispatchBehavior(OperationDescription operationDescription,
        DispatchOperation dispatchOperation)
    {
        RemedyParameterInspector paramInspector = new RemedyParameterInspector
        {
            Permissions = PermissionsToCheck
        };
        dispatchOperation.ParameterInspectors.Add(paramInspector);
    }

    public void Validate(OperationDescription operationDescription)
    {
    }
}

class RemedyParameterInspector : IParameterInspector
{
    public PrimitiveActivity[] Permissions { get; set; }
    public void AfterCall(string operationName, object[] outputs, object returnValue, object correlationState)
    {
    }

    public object BeforeCall(string operationName, object[] inputs)
    {
        Token token = CarrierHelper.ReadMessageHeader<Token>();
        bool hasAccess = Permissions.Any(x => token.HasAccess(x));
        if (!hasAccess)
            throw new Exception(string.Format("Response to end user get failed, User:{0} have not access to operation:{1}...", token.UserGUID, operationName));
        return null;
    }

    private void SetLoggingContext(object[] inputs, MethodInfo mi)
    {
    } 
    private void CreateArgumentForInvokeLog(MethodInfo mi, object[] inputs)
    {

    }
    private void CreateArgumentForResultLog(MethodInfo mi, object[] outputs, object returnValue)
    {

    }

}
提前谢谢

 [RemedyBehavior(PrimitiveActivity.Search, PrimitiveActivity.ManageExam)]
    public DTO_OUT Search(DTO_IN find_DTO_IN)
    {
    }