2009-09-17 2 views
16

Tout en utilisant WCF et OperationContracts je la méthode suivante définie:Comment puis-je forcer WCF à générer automatiquement des WSDL avec les paramètres de méthode requis (minoccurs = "1")?

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

Lorsque cela se traduit à un WSDL par le moteur d'exécution WCF, il se retrouve avec avec minOccurs = « 0 » figurer sur la liste des paramètres someId et MessageData (et renvoie ensuite une erreur d'exécution si ces paramètres sont manquants).

Si je produis un proxy à l'aide SoapUI je reçois quelque chose qui ressemble à ceci:

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

Le champ id dans MyComplexType est marqué avec DataMemeber attribut à l'aide IsRequired = "true "et est donc exposé comme obligatoire. Il est évidemment tout à fait trompeur pour le WSDL de spécifier qu'un paramètre est optionnel quand ce n'est pas le cas, mais je ne vois pas de moyen évident de baliser le OperationContract pour forcer WCF à reconnaître et exposer ces paramètres comme requis. Je suis légèrement déconcerté il ne semble pas un moyen évident de le faire (lecture intellisense/msdn/google). Ou je deviens aveugle et oublie quelque chose d'évident.

Des indices?

+0

J'ai trouvé ce problème Microsoft Connect https://connect.microsoft.com/wcf/feedback/ViewFeedback.aspx ? FeedbackID = 482144 qui implique que cela pourrait ne pas être possible. Qui craint. – DavidWhitney

+0

Avec une réflexion supplémentaire, il semble que les paramètres sont listés comme minoccurs = "0" parce que les types eux-mêmes pourraient être nuls, donc, si quelqu'un a fourni un null, il correspondrait toujours à la méthode sig. Cela n'aide pas pour la génération WSDL et la définition d'un contrat avec une application/organisation appelante. – DavidWhitney

+0

le WSDL généré n'est pas affecté car le type pourrait être nul (types de références vs. types de valeur). Si un type de valeur est omis, la valeur par défaut pour ce type de valeur sera utilisée. Voyez ma réponse ci-dessous cependant. – Thorarin

Répondre

17

Je viens d'écrire un Blog post sur ce sujet, comme je l'ai moi-même rencontré la semaine dernière. Il explique comment vous pouvez modifier les métadonnées générées par WCF lors de l'exécution. En plus du téléchargement du fichier source, il vous suffit d'ajouter un attribut à votre définition de contrat. Comme si:

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

Voici le blog qui explique plus en détail: Controlling WSDL minOccurs with WCF

+0

Approche intéressante. Pouvez-vous me dire si cela fonctionne avec tous les types (marshal par référence et marshal par valeur)? Je sais que les types nullables ont tendance à lire comme des défis dans xsd généré ... Je me demande si cela s'applique à ce que vous faites aussi bien. Dire que je passais plusieurs paramètres 'string' requis. –

0

Vérifiez que MyComplexType est marqué d'un attribut [DataContract].

Pour mon propre contrat WCF, j'ai trouvé que minOccurs = 1 ne s'afficherait pas pour IsRequired = true dans le fichier wsdl généré jusqu'à ce que toute la chaîne d'objets impliqués dans le contrat soit marquée comme telle.

+0

comment c'est bizarre. – DavidWhitney

Questions connexes