代码之家  ›  专栏  ›  技术社区  ›  Shiraz Bhaiji

wcf:同一个faultcontract在许多方法上

  •  13
  • Shiraz Bhaiji  · 技术社区  · 15 年前

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

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

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

    3 回复  |  直到 11 年前
        1
  •  6
  •   marc_s    15 年前

    不,你需要在每一个方法上都这样做-WCF相当挑剔,并且需要对每一个方法都进行明确的设置(我相信这最终是件好事)。

    马克

        2
  •  30
  •   ken2k    11 年前

    可以通过创建自定义属性来完成。

    实现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;
        }
    }
    
        3
  •  0
  •   Preet Sangha    15 年前

    在每个运营合同上都是

    推荐文章