【问题标题】:WCF: Same Faultcontract on many methodsWCF:许多方法上的相同故障契约
【发布时间】:2009-09-08 07:49:49
【问题描述】:

以一个项目为例,它有 10 个服务,每个服务有 20 个方法。

所有服务都继承自具有安全检查的基础服务。每个方法做的第一件事就是调用安全检查。如果出现问题,这会引发安全异常。

问题是:我需要在每个方法(OperationContract)上指定一个 FaultContract,还是可以在一个中心定义中指定一次?

【问题讨论】:

    标签: wcf operationcontract faultcontract


    【解决方案1】:

    您可以通过创建自定义属性来做到这一点。

    实现 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 这确实有帮助。这样 1 属性可以应用于 ServiceContract 接口级别,而不是接口中的每个单独方法。
    • 我同意,这应该被标记为答案。对我来说效果很好,至少对于也使用 WCF 的客户而言。
    【解决方案2】:

    不,您需要在每种方法上都这样做 - WCF 相当挑剔,几乎所有内容都需要显式设置(我相信这最终确实是一件好事)。

    马克

    【讨论】:

    • 您肯定会同意以正交方式实现诸如安全性之类的横切关注点应该是可能的。对我来说,我可以以一种解耦的方式实现一个不错的ServiceAuthorizationManager,这似乎很奇怪,但是如果我想抛出一个自定义安全错误,我就必须在我的合同中撒上重复的垃圾。
    • 我同意,我也在寻找一种自动处理重复垃圾的方法。
    • 您可以编写一些 T4 来从 XML(或其他)文件生成所有合同,并使用自定义逻辑来定义全局故障。 codeplex 上还有一个WSSF 项目,它使用设计器来设计您的合同并生成客户端/服务器代码(这是一个相当繁重的工具)。
    【解决方案3】:

    在每个运营合同上都是

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-04
      • 2013-05-03
      • 2012-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-28
      • 2014-06-27
      相关资源
      最近更新 更多