2010-10-18 2 views
18

Ich erstelle einen WCF-Dienst mithilfe des Nachrichtenvertragsmodells.Wie kann ich den Namen eines generischen WCF-Nachrichtenvertrags steuern?

Ich habe einen allgemeinen Anfrage Nachrichtenvertrag wie so erstellt:

[MessageContract] 
public Request<T> 
{ 
    [MessageBodyMember] 
    public T Details { get; set; } 
} 

ich zur Verwendung von [DataContract(Name="Contract{0}")] verwende lesbaren Namen für generische Datenverträge zu produzieren, aber dieser Ansatz scheint nicht für mich zu arbeiten Nachricht mit Verträge.

Gibt es eine Möglichkeit, das gleiche Verhalten mit dem Nachrichtenvertragsmodell zu erreichen?

Antwort

2

Es gibt eine und WrapperNamespace Eigenschaft auf dem MessageContract Attribut, das ich glaube, das Gleiche tut. Z. B.

[MessageContract(WrapperName = "FooMessage", IsWrapped = true)] 
public class Request<T> 
{ ... } 

Notiere die Zugabe der IsWrapped Eigenschaft, um anzuzeigen, dass die Nachricht in das Wrapper-Element serialisiert werden soll.

+0

Ich versuchte dies mit WrapperName = "WrapperFor {0}", aber dies zu einem ziemlich fiesen Namen in der WSDL (das Unicode-Äquivalent von {0}) gelöst und führte nicht die Übersetzung, die ich erwartet hatte. –

+0

Darüber hinaus scheint dies eine Ausnahme auszulösen, wenn "T" auch ein generischer Typ ist und die Eigenschaft "DataContract Name" Platzhalter verwendet, z. 'GenericOf {0}'. Ich würde mich interessieren zu wissen, ob Generic MessageContracts und DataContracts zusammen mit überschriebenen generischen Namen verwendet werden können, so habe ich ein Kopfgeld auf diese Frage gesetzt –

4

Es scheint eine Menge Arbeit für das, was Sie erreichen möchten, aber ich glaube, Sie können einen MessageInspector erstellen, mit dem Sie direkt mit dem XML interagieren können.

Client-Nachricht Inspektoren implementieren die IClientMessageInspector Schnittstelle und Service-Nachricht Inspektoren implementieren die IDispatchMessageInspector Schnittstelle.

http://msdn.microsoft.com/en-us/library/aa717047.aspx

Jeder Dienst (Dispatcher) Nachricht Prüfer muss die beiden IDispatchMessageInspector Methoden AfterReceiveRequest und BeforeSendReply implementieren.

Der Link geht in viel mehr Details, aber sobald Sie diese implementiert haben, sollten Sie in der Lage sein, den Inspektor zu Ihrer web.config hinzuzufügen, und Sie sollten alle eingestellt werden.

+1

Ich denke, Sie haben die Frage möglicherweise missverstanden. Gegeben ist ein generischer MessageContract, z. 'Anfrage ', wie hat man einen * sauberen * Namen, der in der WSDL für Eingaben generiert wird, die geschlossene generische Typen von 'Anfrage ' sind, z. 'Anfrage '. Das OP möchte in der WSDL für den früheren generischen Typ einen Namen wie 'RequestOfServiceInput' generieren, aber es scheint, dass die Benennung von generischen Typen für MessageContracts nicht wie hier beschrieben mit DataContracts funktioniert: http://msdn.microsoft. com/de-us/library/ms731045.aspx # sectionSection4 –

+0

Sie können @RussCam korrekt sein. In diesem Fall müsste er "IWsdlExportExtension" verwenden, um die WSDL anzupassen/zu erweitern. Ein Beispiel dafür finden Sie hier: http://blogs.msdn.com/b/skaufman/archive/2009/05/29/exposing-custom-wcf-headers-through-wcf-behaviors.aspx – marcellscarlett

Verwandte Themen