Question

Je voulais créer une méthode unidirectionnelle pour le service WCF.Tout va bien sauf si je veux retourner le message défaut - le cas échéant.

J'utilise le générateur de code bleu wscf pour les fichiers wsdl et contract.

Dans l'élément d'opération wsdl, je n'ai que les éléments enfants « Input » et « Fault ».Lorsque j'exécute le service, j'ai reçu les informations qui ne peuvent pas déclarer de message d'erreur dans une communication unidirectionnelle et ..l'une des solutions est de définir one-way sur false ..ce que j'ai fait et bien ça marche ok.Si une erreur se produit, je reçois le message.

Cependant, je me demande si j'ai enfreint les règles de création du service Web/wsdl...Parce qu'à partir du générateur de schéma de service wsdl, il crée pour moi une communication unidirectionnelle (définie sur "true") et d'autres générateurs dans d'autres langages de programmation feraient probablement la même chose...

Alors, est-ce correct ce que j'ai fait ?Comment puis-je modifier wsdl pour que le générateur puisse créer le code de manière appropriée ?

Si en théorie je ne peux pas utiliser l'erreur dans une communication unidirectionnelle, ai-je besoin d'une structure supplémentaire en réponse pour renvoyer une erreur ?

Merci!

Était-ce utile?

La solution

C'est vrai que les opérations à sens unique ne peuvent pas renvoyer de défauts aux clients.Si vous souhaitez générer un void pas à sens unique opération de service dans WCF, vous devrez ajouter un élément de sortie vide pour cette opération dans votre contrat WSDL.

Les analyseurs WSDL basés sur .NET (tels que WSCF.bleu et svcutil) générera des opérations de service à sens unique pour <wsdl:operation> des éléments qui ne le faites pas avoir un correspondant <wsdl:output> élément.

Par exemple cette opération WSDL est à sens unique:

<wsdl:definitions>
    <wsdl:portType>
        ... 
        <wsdl:operation name="Foo">
           <wsdl:input message="tns:FooRequest" />
        </wsdl:operation>
    </wsdl:portType>
</wsdl:definitions>

En revanche, définir une opération avec un vide <wsdl:output> élément (c'est-à-dire un type XSD contenant un séquence vide) sera mappé à un void pas à sens unique méthode en .NET, qui peut éventuellement contenir une déclaration de faute :

<wsdl:definitions>
    <wsdl:portType>
        ... 
        <wsdl:operation name="Foo">
           <wsdl:input message="tns:FooRequest" />
           <wsdl:output message="tns:FooResponse" />
           <wsdl:fault message="tns:FooFault" />
        </wsdl:operation>
    </wsdl:portType>
</wsdl:definitions>

où le <tns:FooResponse> le type est simplement défini comme :

<xs:element name="FooResponse">
    <xs:complexType>
        <xs:sequence/>
    </xs:complexType>
</xs:element>

Autres conseils

Dans WCF, une opération à sens unique L'opération n'a pas de valeurs retournées et que le client ne se soucie pas du succès ou de l'échec de l'invocation.

Dans la WCF, nous avons également eu d'autres opérations naturellement à sens unique, telles que vous exploitez MSMQ via WCF, puis les opérations sont normalement définies sur une manière à sens unique.

Donc, si vous voulez retourner quelque chose pour indiquer le statut d'invocation, un seul passage n'est pas un choix correct, vous pouvez simplement utiliser l'opération de WCF normale qui n'est pas à la place.

Pour une opération à sens unique, voici un article de votre référence wcf une manière

Je sens que tu as fait la bonne chose.Pour tout type de client (C #, Java, C ++, PHP), ils ont juste besoin de WSDL pour créer le proxy.Je pense que cela devrait également travailler dans d'autres langues.Mieux utiliser SoaPui (client de savon neutre) pour tester votre service.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top