2009-09-17 2 views
16

Während WCF und OperationContracts Verwendung habe ich die folgende Methode definiert:Wie kann ich WCF zwingen, WSDLs mit den erforderlichen Methodenparametern (minoccurs = "1") automatisch zu generieren?

[OperationContract] 
    [FaultContract(typeof(ValidationFault))] 
    [FaultContract(typeof(FaultException<ExceptionDetail>))] 
    int DoSomething(int someId, MyComplexType messageData); 

Wenn diese von der WCF-Laufzeit auf eine WSDL übersetzt wird, es endet mit mit minOccurs = „0“ aufgelistet für die Parameter someId und message (und gibt anschließend einen Laufzeitfehler aus, wenn diese Parameter fehlen).

Wenn ich generieren einen Proxy verwenden SoapUI ich etwas, das wie folgt aussieht:

<com:DoSomething> 
    <!--Optional--> 
    <com:EventId>1</com:EventId> 
    <!--Optional--> 
    <com:myComplexType > 
     <com:id>1</com:id> 
    </com:myComplexType > 
    </com:DoSomething> 

Das ID-Feld in MyComplexType mit DataMemeber Attribut markiert mit IsRequired = "true "und wird somit als obligatorisch herausgestellt. Es ist offensichtlich ziemlich irreführend für die WSDL, anzugeben, dass ein Parameter optional ist, wenn dies nicht der Fall ist, aber ich sehe keine offensichtliche Möglichkeit, den OperationContract zu markieren, um WCF zu zwingen, diese Parameter nach Bedarf zu erkennen und verfügbar zu machen.

Ich bin ein wenig verblüfft es scheint nicht eine offensichtliche Möglichkeit, dies zu tun (Lesen intellisense/msdn/google). Oder ich werde blind und übersehe etwas Offensichtliches.

Irgendwelche Hinweise?

+0

ich dieses Microsoft Connect Problem gefunden habe https://connect.microsoft.com/wcf/feedback/ViewFeedback.aspx ? FeedbackID = 482144, das bedeutet, dass dies möglicherweise nicht möglich ist. Welche saugt. – DavidWhitney

+0

Mit weiteren Gedanken scheint es, als ob die Parameter als minoccurs = "0" aufgeführt sind, da die Typen selbst null sein könnten. Wenn also jemand eine Null liefert, würde es immer noch der Methode sig entsprechen. Noch hilft nicht für die Zwecke der WSDL-Generierung und die Definition eines Vertrags mit einer aufrufenden Anwendung/Organisation. – DavidWhitney

+0

Die generierte WSDL ist nicht betroffen, da der Typ null sein kann (Referenztypen vs. Werttypen). Wenn ein Werttyp weggelassen wird, wird der Standardwert für diesen Werttyp verwendet. Siehe meine Antwort unten jedoch. – Thorarin

Antwort

17

Ich habe gerade eine Blog post über dieses Thema geschrieben, als ich letzte Woche selbst in das Problem lief. Es wird erläutert, wie Sie die Metadaten ändern können, die WCF zur Laufzeit generiert.

Neben dem Herunterladen der Quelldatei müssen Sie lediglich ein Attribut zu Ihrer Vertragsdefinition hinzufügen. Wie so:

[ServiceContract] 
[RequiredParametersBehavior] 
public interface ICalculatorService 
{ 
    [OperationContract] 
    int Add(int firstValue, int secondValue); 
} 

Hier ist die Blog-Post, die es näher erklärt: Controlling WSDL minOccurs with WCF

+0

Interessanter Ansatz. Kannst du mir sagen, ob das mit allen Typen funktioniert (Marshal by Reference und Marshal by Value)? Ich weiß, dass Nullable-Typen dazu tendieren, sich als Herausforderungen in generiertem xsd zu lesen ... Ich frage mich, ob dies auch für das gilt, was Sie tun. Angenommen, ich habe mehrere erforderliche 'string' Parameter übergeben. –

0

Überprüfen Sie, ob MyComplexType mit einem [DataContract] -Attribut markiert ist.

Für meinen eigenen WCF-Vertrag fand ich, dass minOccurs = 1 für IsRequired = true in der generierten wsdl nicht angezeigt wurde, bis die gesamte Kette der Objekte, die in den Vertrag einbezogen wurden, als solche markiert wurde.

+0

Wie seltsam ist das. – DavidWhitney

Verwandte Themen