WCF IOperationBehavior不起作用,多种操作行为

时间:2017-11-13 15:41:37

标签: c# .net wcf aop

作为AOP实现,我有两个派生自IOperationBehavior的类,如:

public class RemedyBehaviorAttribute : Attribute, IOperationBehavior
{
    .....
    public RemedyBehaviorAttribute(params PrimitiveActivity[] pi)
    {
        PermissionsToCheck = pi;
    }
    ...
}

public class AuthorityCheckAttribute : Attribute, IOperationBehavior
{
    ....
    public AuthorityCheckAttribute(bool initiateAuthorities = false)
    {
        InitiateAuthorities = initiateAuthorities;
    }
    ....
}

当我想通过WCF实现的操作应用它们时,如:

[RemedyBehavior(PrimitiveActivity.Search)]
[AuthorityCheck(true)]
public FindStudies_DTO_OUT FindStudies(FindStudies_DTO_IN findStudies_DTO_IN)
{
....
}
<{1>} BeforeCall IParameterInspector中的一个启动,如:

class RemedyParameterInspector : IParameterInspector
{
    public bool InitiateAuthorities { get; set; }

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

    public object BeforeCall(string operationName, object[] inputs)
    {
        //Here one of them initiated , just the first one
        // the Permissions is null if AuthorityCheckAttribute was the first
        // the InitiateAuthorities is null if RemedyBehaviorAttribute was the first 
    }
}

只是RemedyBehavior构造函数被调用并启动,如果我改变它们的顺序,如:

[AuthorityCheck(true)]
[RemedyBehavior(PrimitiveActivity.Search)]
public FindStudies_DTO_OUT FindStudies(FindStudies_DTO_IN findStudies_DTO_IN)
{
....
}

BeforeCall中仅发起了AuthorityCheck内容,因为它被称为我在代码中的评论中提及。

那么为什么他们两个的构造函数都不会被称为WCF操作行为?

有没有办法做到这一点,或者我应该将主题组合成一个类?

真正感谢任何进一步的帮助。

更新

我为ApplyClientBehavior实施了ApplyDispatchBehaviorAuthorityCheckAttribute,如:

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

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

RemedyBehaviorAttribute之类的:

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

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

0 个答案:

没有答案