2009-09-08 7 views
13

Nehmen Sie zum Beispiel ein Projekt mit 10 Diensten und 20 Methoden für jeden Dienst.WCF: Gleicher Fehler bei vielen Methoden

Alle Dienste erben von einem Basisdienste, die eine Sicherheitsüberprüfung hat. Das erste, was jede Methode tut, ist einen Anruf bei der Sicherheitsprüfung zu machen. Dies löst eine Sicherheitsausnahme aus, wenn ein Problem auftritt.

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

Antwort

6

Nein, Sie es auf jedem und jede Methode tun müssen - WCF ist ziemlich wählerisch und erfordert explizite Einstellungen so ziemlich für alles (was wirklich eine gute Sache am Ende ist, ich bin überzeugt).

Marc

+0

Sicher würden Sie zustimmen, dass es möglich sein sollte, übergreifende Bedenken wie Sicherheit in einer orthogonalen Weise zu implementieren. Es erscheint mir merkwürdig, dass ich einen netten 'ServiceAuthorizationManager' entkoppeln kann, aber dann muss ich meine Verträge mit repetitivem Müll überstreuen, wenn ich einen benutzerdefinierten Sicherheitsfehler auslösen will. –

+0

Ich stimme zu, ich bin auf der Suche nach einer Methode, um den sich wiederholenden Müll automatisch zu tun. – joelsand

+0

Sie können einige T4 schreiben, um alle Ihre Verträge aus einer XML-Datei (oder einer anderen Datei) zu generieren, und haben Ihre eigene Logik, um globale Fehler zu definieren. Es gibt auch das Projekt [WSSF] (http://servicefactory.codeplex.com/) auf Codeplex, das einen Designer für Ihre Verträge verwendet und Client/Server-Code generiert (es ist ein ziemlich schweres Tool). – SandRock

0

Ja auf jeden Betrieb Vertrag

30

Sie können es tun, indem Sie ein benutzerdefiniertes Attribut zu schaffen.

Implementieren Sie IContractBehavior und fügen Sie den Fehler zu jeder Operation der Validate-Methode hinzu.

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

Hier a link die details, wie dies zu erreichen. Unter dem eigentlichen Code zu verwenden:

+0

+1 Danke, ich werde das bei unserem nächsten Projekt ausprobieren –

+0

+1 Das hilft. Auf diese Weise kann 1 Attribut auf der ServiceContract-Schnittstellenebene statt auf jeder einzelnen Methode in der Schnittstelle angewendet werden. – CodingWithSpike

+1

Dies sollte als Antwort markiert werden. –

Verwandte Themen