Pregunta

Tomemos, por ejemplo, un proyecto con 10 servicios y 20 métodos en cada servicio.

Todos los servicios de heredar de una base de servicios de los cuales tiene un control de seguridad. Lo primero que hace cada método es hacer una llamada a la comprobación de seguridad. Esto arroja una excepción de seguridad si hay un problema.

La pregunta es: ¿Es necesario especificar un FaultContract sobre cada método (OperationContract), o puede hacer que una vez en el centro de una definición

¿Fue útil?

Solución

No, es necesario hacerlo en todos y cada método - WCF es bastante exigente y requiere una configuración más o menos explícitas para todo (que en realidad es una cosa buena al final, estoy convencido)

.

Marc

Otros consejos

Puede hacerlo mediante la creación de un atributo personalizado.

Implementar IContractBehavior y agregar la culpa a cada operación en el método Validar.

void IContractBehavior.Validate(ContractDescription contractDescription, ServiceEndpoint endpoint)
{
   foreach (OperationDescription od in contractDescription.Operations)
      od.Add(yourFault);
}

Aquí hay un enlace que los detalles de cómo lograr esto. A continuación el código real de empleo:

[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;
    }
}

Sí en cada contrato de operación

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top