Comment un analyseur WSDL décide de générer une méthode vide pour une opération de demande / réponse?

StackOverflow https://stackoverflow.com/questions/8316567

Question

J'ai passé 5 heures à ce sujet, et je l'ai déjà 30 heures d'écriture de cette spécification contrat première (date limite « agressif », ergo stupide) et je ne peux pas voir ce que je suis absent.

Je ne veux pas une opération à sens unique que j'attends des défauts. Je l'ai déjà construit un service simple WCF et examiné le WSDL qu'il génère et fait aller-retour à une méthode vide mais je l'ai été à regarder si longtemps (et WSDL 1.1 est si gênant au meilleur des temps - rouler sur 2.0 s'il vous plaît) que je ne peux pas voir plus ce que le truc magique est.

Quelqu'un peut-il fournir une WSDL très simple expliquant la magie? Je suis qui cible la JAX-WS 2.2 et WCF 3.5 / 4.0 avec ce WSDL. Je suis en train d'écrire à la main le WSDL et chaque fois que je tente de construire des procurations (en Java ou .net) il construit toujours une méthode avec le message de retour. Je perdre.

Était-ce utile?

La solution

Une méthode « vide » ne signifie pas nécessairement que c'est une opération à sens unique. Les deux opérations ci-dessous sont différentes:

[ServiceContract]
public interface ITest
{
    [OperationContract(IsOneWay = true)]
    void Process1();
    [OperationContract]
    void Process2();
}

La première est vraiment une opération à sens unique - toutes les exceptions / défauts lancées par le serveur ne seront pas propagées au client, alors que dans le second, bien qu'il ne rien « retour », si le serveur lance une exception (par exemple, un FaultException), l'exception sera retourné à l'appelant.

Mise à jour : pour répondre à la question posée dans le titre, l'analyseur WSDL décide de générer une opération vide (au moins celui utilisé par WCF) si le schéma du message de sortie de l'opération est vide.

Par exemple, dans le code ci-dessous:

public class StackOverflow_8316567
{
    [ServiceContract]
    public interface ITest
    {
        [OperationContract(IsOneWay = true)]
        void Process1();
        [OperationContract]
        void Process2();
        [OperationContract]
        int Add(int x, int y);
    }
    public class Service : ITest
    {
        public void Process1() { }
        public void Process2() { }
        public int Add(int x, int y) { return x + y; }
    }
    static Binding GetBinding()
    {
        var result = new BasicHttpBinding();
        return result;
    }
    public static void Test()
    {
        string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
        ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress));
        host.AddServiceEndpoint(typeof(ITest), GetBinding(), "");
        host.Description.Behaviors.Add(new ServiceMetadataBehavior { HttpGetEnabled = true });
        host.Open();
        Console.WriteLine("Host opened");

        Console.Write("Press ENTER to close the host");
        Console.ReadLine();
        host.Close();
    }
}

Si vous exécutez et accédez à http: // localhost: 8000 / Service wsdl » verrez que:

  1. L'opération Process1 (sous WSDL: portType / WSDL: fonctionnement) ne dispose que d'un message d'entrée
  2. les deux Add et Process2 (opérations de r / R) ont à la fois une entrée et les messages de sortie

Maintenant, la partie de message pour le message de sortie pour ces 2 opérations de référence leur schéma dans le schéma importé ( http: // localhost: 8000 / Service xsd = xsd0 )?. Vous pouvez voir que:

  1. Le schéma de la réponse à l'opération de Process2 (type complexe Process2Response) est un élément vide (à savoir, une séquence vide)
  2. Le schéma de la réponse à l'opération de Add (de AddResponse) est une séquence contenant un élément (une valeur de xs:int).

Ainsi, le processeur génère une méthode void pour Process2 (car il ne retourne rien) et une méthode non nulle pour Add.

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