Come fa un parser WSDL decidere di generare un metodo vuoto per un'operazione di richiesta / risposta?
-
25-10-2019 - |
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.
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:
- Il
Process1
operazione (in WSDL: portType / wsdl: operation) ha solo un messaggio di input - sia
Add
eProcess2
(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:
- Lo schema per la risposta al funzionamento
Process2
(tipo complessoProcess2Response
) è un elemento vuoto (cioè una sequenza vuota) - Lo schema per la risposta al funzionamento
Add
(AddResponse
) è una sequenza contenente un elemento (un valorexs:int
).
Quindi, il processore genera un metodo per void
Process2
(dal momento che non restituisce nulla) e un metodo non-vuoto per Add
.