首页 > 解决方案 > 在 WCF 的自定义属性中抛出自定义异常

问题描述

我有一个 WCF 服务,想限制它的一项操作(我希望只能在晚上 18:00 之后调用特殊操作)。我声明了自定义属性,现在我想在时间结束时抛出自定义异常(根据我的业务),但我不知道如何抛出它。

    [MyAttribute]
    public long InsertOffer(Offer offer)
    {}

//************************************************

public class MyAttribute: Attribute, IOperationBehavior
    {

    public void ApplyClientBehavior(OperationDescription operationDescription, ClientOperation clientOperation)
    {
        return;
    }
    //**********************************

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

    public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation)
    {
        
        if (DateTime.Now.ToLongTimeString().CompareTo(endTime.ToLongTimeString()) > 0)
        {
            throw new EMTException("MY MESSAGE");
        }
    }
}

在这种情况下,当我想在客户端更新服务时,它会抛出异常(当我不想在运行时更新时)。

感谢您的帮助

标签: wcfattributes

解决方案


这是我的演示:

我们可以使用 IDispatchMessageInspector 拦截所有请求,然后判断并抛出异常:

public class ServerMessageLogger : IDispatchMessageInspector
{
    public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
    {
        if (DateTime.Now.ToLongTimeString().CompareTo(endTime.ToLongTimeString()) > 0)
        {
            throw new FaultException("MY MESSAGE");
        }
    }

    public void BeforeSendReply(ref Message reply, object correlationState)
    {
       
    }
}

将 ServerMessageLogger 添加到服务行为:

[AttributeUsage(AttributeTargets.Interface | AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)]
public class CustContractBehaviorAttribute : Attribute, IContractBehavior, IContractBehaviorAttribute, IOperationBehavior
{
    public Type TargetContract => throw new NotImplementedException();

    public void AddBindingParameters(ContractDescription contractDescription, ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
    {
        return;
    }

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

    public void ApplyClientBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, ClientRuntime clientRuntime)
    {
        return;
    }

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

    public void ApplyDispatchBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, DispatchRuntime dispatchRuntime)
    {
        dispatchRuntime.MessageInspectors.Add(new ServerMessageLogger());
    }

    public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation)
    {

    }

    public void Validate(ContractDescription contractDescription, ServiceEndpoint endpoint)
    {
        return;
    }

    public void Validate(OperationDescription operationDescription)
    {
        return;
    }
}

在此处输入图像描述

最后,我们将此属性应用于服务。需要注意的是,由于我们将这个属性应用到整个服务中,所以服务中的所有方法都受到这个限制。解决方案是将 InsertOffer 拆分为另一个服务,然后应用它。


推荐阅读