以每个服务中包含10个服务和20个方法的项目为例。WCF:在许多方法上都有同样的错误合同
所有服务都从具有安全检查的基本服务继承。每种方法做的第一件事就是打电话给安全检查。如果出现问题,会引发安全异常。
问题是:我需要在每个方法(OperationContract)上指定一个FaultContract,还是我可以在中心定义中执行一次?
以每个服务中包含10个服务和20个方法的项目为例。WCF:在许多方法上都有同样的错误合同
所有服务都从具有安全检查的基本服务继承。每种方法做的第一件事就是打电话给安全检查。如果出现问题,会引发安全异常。
问题是:我需要在每个方法(OperationContract)上指定一个FaultContract,还是我可以在中心定义中执行一次?
不上,你需要做的是对每一个方法 - WCF是相当挑剔,需要明确的设置几乎一切(这真的是到底是一件好事,我我深信)。
Marc
是每个经营合同
你可以通过创建一个自定义属性来实现。
实现IContractBehavior并将错误添加到Validate方法的每个操作。
void IContractBehavior.Validate(ContractDescription contractDescription, ServiceEndpoint endpoint)
{
foreach (OperationDescription od in contractDescription.Operations)
od.Add(yourFault);
}
这里的a link详细说明如何实现这一点。低于实际使用的代码:
[AttributeUsage(AttributeTargets.Interface, AllowMultiple = false, Inherited = true)]
public class StandardFaultsAttribute : Attribute, IContractBehavior
{
// this is a list of our standard fault detail classes.
static Type[] Faults = new Type[]
{
typeof(AuthFailure),
typeof(UnexpectedException),
typeof(UserFriendlyError)
};
public void AddBindingParameters(ContractDescription contractDescription, ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
{
}
public void ApplyClientBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, ClientRuntime clientRuntime)
{
}
public void ApplyDispatchBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, DispatchRuntime dispatchRuntime)
{
}
public void Validate(ContractDescription contractDescription, ServiceEndpoint endpoint)
{
foreach (OperationDescription op in contractDescription.Operations)
{
foreach (Type fault in Faults)
{
op.Faults.Add(MakeFault(fault));
}
}
}
private FaultDescription MakeFault(Type detailType)
{
string action = detailType.Name;
DescriptionAttribute description = (DescriptionAttribute) Attribute.GetCustomAttribute(detailType, typeof(DescriptionAttribute));
if (description != null)
action = description.Description;
FaultDescription fd = new FaultDescription(action);
fd.DetailType = detailType;
fd.Name = detailType.Name;
return fd;
}
}
+1谢谢,我会在我们的下一个项目 – 2010-12-02 08:00:15
+1上试用这个帮助。这种方式1属性可以应用在ServiceContract接口级别,而不是接口中的每个单独的方法。 – CodingWithSpike 2011-01-31 14:38:45
这应该被标记为答案。 – 2015-03-26 13:16:53
当然,您会同意以正交的方式实施交叉担忧,如安全性。对我来说,我可以以一种分离的方式实现一个很好的'ServiceAuthorizationManager'似乎很奇怪,但是如果我想抛出一个定制的安全错误,那么我必须将我的合同用重复的垃圾进行分配。 – 2010-04-28 12:42:05
我同意,我正在寻找一种自动执行重复性垃圾的方法。 – joelsand 2010-05-07 15:24:58
您可以编写一些T4来从XML(或其他)文件生成所有合同,并使用您的自定义逻辑来定义全局错误。在codeplex上还有一个[WSSF](http://servicefactory.codeplex.com/)项目,它为您的合约使用设计器并生成客户端/服务器代码(这是一个相当繁重的工具)。 – SandRock 2012-11-06 14:58:46