在 WCF 的自定义属性中抛出自定义异常
Throw custom Exception in Custom Attribute in 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");
}
}
}
在这种情况下,当我想更新客户端中的服务时,它会抛出异常(当我不想在 运行 时间更新时)。
感谢您的帮助
这是我的演示:
我们可以使用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;
}
}
最后,我们将此属性应用到服务中。 需要注意的是,因为我们将这个Attribute应用到整个服务中,所以服务中的所有方法都受到这个限制。解决方法是把InsertOffer拆分成另外一个服务再应用。
我有一个 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");
}
}
}
在这种情况下,当我想更新客户端中的服务时,它会抛出异常(当我不想在 运行 时间更新时)。
感谢您的帮助
这是我的演示:
我们可以使用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;
}
}
最后,我们将此属性应用到服务中。 需要注意的是,因为我们将这个Attribute应用到整个服务中,所以服务中的所有方法都受到这个限制。解决方法是把InsertOffer拆分成另外一个服务再应用。