wcf - 在 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;
}
}
最后,我们将此属性应用于服务。需要注意的是,由于我们将这个属性应用到整个服务中,所以服务中的所有方法都受到这个限制。解决方案是将 InsertOffer 拆分为另一个服务,然后应用它。
推荐阅读
- javascript - 如何将一个列表中的值存储到特定属性的另一个列表中?
- scss-mixins - SCSS mixin 第二个参数未正确编译
- c - 在STM32上调用Timer_callback时丢失指针地址
- r - 如何在R中的几个步骤中收集列而不丢失分组
- c# - 如何在请求中传递字符串列表?
- django - 工作服:错误 - 在我的使用 Docker 容器的应用程序中没有来源
- gradle - 使用 farmRun 任务时不应用 Gretty 配置
- google-cloud-storage - 如何将 Google 存储桶权限授予 Google Speech to text API?
- java - 如何在 onclick 方法中重置标签上的所有内容
- python - 使用 Python 在 Interactive Brokers 的列表中获取 permID