Domanda

Volevo creare un metodo unidirezionale per il servizio WCF. Tutto è ok a meno che Voglio restituire il messaggio di errore, se presente.

Sto usando WSCF Blue Code Generator per WSDL e file contract.

Nell'elemento operativo WSDL Ho solo "input" e gli elementi del figlio 'Guasto'. Quando eseguo il servizio ho ricevuto le informazioni che non possono dichiarare il messaggio di errore in una comunicazione a senso unico e .. Una delle soluzioni è quella di impostare unidirezionale per false .. Cosa ho fatto e bene funziona bene. Se si verifica un errore, ottengo il messaggio.

Comunque mi chiedo se ho rotto le regole di creazione del servizio Web / WSDL ... perché dal generatore di schemi di servizio WSDL crea per me la comunicazione a senso unico (impostata su "True") e altri dei generatori di altri linguaggi di programmazione sarebbe probabilmente Fai lo stesso ...

Quindi è corretto ciò che ho fatto? Come posso cambiare wsdl in modo che il generatore possa creare il codice in modo appropriato?

Se in teoria non riesco a utilizzare il guasto in comunicazione unidirezionale, allora ho bisogno di una struttura extra sulla risposta per restituire qualsiasi errore?

Grazie!

È stato utile?

Soluzione

È vero che Operazioni a unidirezionale non possono restituire errori ai clienti. Se si desidera generare un funzionamento del servizio void Not one-way in WCF dovrai Aggiungi un elemento di uscita vuoto per quell'operazione nel contratto WSDL.

i parser di WSDL basata .NET (come wscf.blue e svcutil ) genererà operazioni di servizio a unidirezionale per elementi <wsdl:operation> che non avere un elemento <wsdl:output> corrispondente.

Ad esempio questa operazione WSDL è unidirezionale :

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

D'altra parte, definendo un'operazione con un elemento <wsdl:output> vuoto (cioè un tipo XSD contenente una sequenza vuota ) sarà mappata su un void non solo Metodo in .NET, che può opzionalmente contenere una dichiarazione di errore:

<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>
.

Dove il tipo <tns:FooResponse> è semplicemente definito come:

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

Altri suggerimenti

In WCF, il funzionamento di unidirezionale non ha valori restituiti e il cliente non si preoccupa del successo o del fallimento dell'invocazione.

In WCF, abbiamo anche ricevuto altre operazioni che sono naturalmente a senso unico, come se si gestisce MSMQ tramite WCF, quindi le operazioni sono normalmente impostate su una via.

Quindi, se si desidera restituire qualcosa per indicare lo stato di invocazione, allora unidirezionale non è una scelta corretta, puoi semplicemente utilizzare il normale funzionamento WCF che non è unidirezionale invece.

Per il funzionamento a unidirezionale, ecco un articolo per il tuo riferimento WCF One-way

Sento che hai fatto una cosa corretta.Per qualsiasi tipo di cliente (C #, Java, C ++, PHP) hanno solo bisogno di WSDL per creare il proxy.Sento che dovrebbe funzionare anche in altre lingue.Meglio usare Soapui (Neutral Soap Client) per testare il tuo servizio.

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