Come fa un parser WSDL decidere di generare un metodo vuoto per un'operazione di richiesta / risposta?

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

Domanda

Ho trascorso 5 ore su questo, e ho già stato fino 30 ore a scrivere questo spec contratto a prima (scadenza "aggressivo", ergo stupido) e non riesco a vedere ciò che mi manca.

Non voglio un'operazione a senso unico come mi aspetto difetti. Ho già costruito un semplice servizio WCF e ha esaminato il WSDL che genera e ha di andata e ritorno a un metodo vuoto, ma sto fissando così a lungo (e WSDL 1.1 è così fastidioso allo migliore dei tempi - roll su 2.0 per favore) che non riesce più a vedere ciò che il trucco magico è.

Qualcuno può fornire qualche molto semplice WSDL spiegare la magia? Sono rivolte a entrambe le JAX-WS 2.2 e WCF 3.5 / 4.0 con questo WSDL. Sto scrivendo a mano il WSDL e ogni volta che cerco di deleghe di compilazione (in java o .net) si costruisce sempre un metodo con il messaggio di ritorno. Sto perdendo.

È stato utile?

Soluzione

metodo di "vuoto" A non significa necessariamente che si tratta di un'operazione a senso unico. Le due operazioni di seguito sono diversi:

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

Il primo è in realtà un'operazione a senso unico - eventuali eccezioni / guasti generate dal server non saranno propagate al cliente, mentre nel secondo, anche se non si nulla di "ritorno", se il server getta un'eccezione (ad esempio, un FaultException), l'eccezione verrà restituito al chiamante.

Aggiorna : per rispondere alla domanda posta nel titolo, il parser WSDL decide di generare un'operazione di vuoto (almeno quello usato da WCF) se lo schema per il messaggio di output dell'operazione è svuotare.

Ad esempio, nel seguente codice:

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();
    }
}

Se lo si esegue e passare alla http: // localhost: 8000 / servizio WSDL te' vedrai che:

  1. Il Process1 operazione (in WSDL: portType / wsdl: operation) ha solo un messaggio di input
  2. sia Add e Process2 (r / r operazioni) avere sia un input ei messaggi di output

Ora, la parte del messaggio per il messaggio in uscita per quei 2 operazioni di referenza loro schema nel schema importato (a http: // localhost: 8000 / servizio xsd = xsd0 )?. Si può vedere che:

  1. Lo schema per la risposta al funzionamento Process2 (tipo complesso Process2Response) è un elemento vuoto (cioè una sequenza vuota)
  2. Lo schema per la risposta al funzionamento Add (AddResponse) è una sequenza contenente un elemento (un valore xs:int).

Quindi, il processore genera un metodo per void Process2 (dal momento che non restituisce nulla) e un metodo non-vuoto per Add.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top