Frage

Nehmen Sie zum Beispiel ein Projekt mit 10 Diensten und 20 Methoden für jeden Dienst.

Alle Dienste erben von einem Basisdiensten, der eine Sicherheitsprüfung hat. Das erste, was jede Methode tut, ist, einen Anruf bei der Sicherheitsprüfung zu tätigen. Dies macht eine Sicherheitsausnahme aus, wenn es ein Problem gibt.

Die Frage ist: Muss ich einen Fehlerunternehmen für jede Methode (OperationContract) angeben, oder kann ich es einmal in einer zentralen Definition tun?

War es hilfreich?

Lösung

Nein, Sie müssen es bei jeder Methode tun - WCF ist ziemlich wählerisch und erfordert explizite Einstellungen für alles (was am Ende wirklich gut ist, ich bin überzeugt).

Marc

Andere Tipps

Sie können dies tun, indem Sie ein benutzerdefiniertes Attribut erstellen.

Implementieren Sie IcontractBehavior und fügen Sie den Fehler zu jedem Vorgang der Validierungsmethode hinzu.

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

Hier ist eine Verbindung Das beschreibt, wie dies erreicht werden kann. Unter dem zu verwendenden Code:

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

Ja für jeden Betriebsvertrag

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top