Come posso forzare WCF per generare automaticamente WSDL con i parametri del metodo richiesti (minoccurs = "1")?

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

  •  08-07-2019
  •  | 
  •  

Domanda

Durante l'utilizzo di WCF e OperationContracts ho definito il seguente metodo:

    [OperationContract]
    [FaultContract(typeof(ValidationFault))]
    [FaultContract(typeof(FaultException<ExceptionDetail>))]
    int DoSomething(int someId, MyComplexType messageData);

Quando questo viene tradotto in un WSDL dal runtime WCF, finisce con minoccurs = " 0 " elencato per i parametri someId e messageData (e successivamente genera un errore di runtime se mancano questi parametri).

Se generi un proxy usando SoapUI ottengo qualcosa che assomiglia a questo:

  <com:DoSomething>
     <!--Optional-->
     <com:EventId>1</com:EventId>
     <!--Optional-->
     <com:myComplexType >
        <com:id>1</com:id>
     </com:myComplexType >
  </com:DoSomething>

Il campo ID in MyComplexType è contrassegnato con l'attributo DataMemeber utilizzando IsRequired = " true " e quindi è esposto come obbligatorio.

Ovviamente è abbastanza fuorviante per il WSDL specificare che un parametro è facoltativo quando non lo è, ma non riesco a vedere alcun modo ovvio per contrassegnare l'OperationContract per forzare WCF a riconoscere ed esporre questi parametri come richiesto.

Sono un po 'confuso che non sembra un modo ovvio per farlo (leggendo intellisense / msdn / google). O sto diventando cieco e trascuro qualcosa di ovvio.

Qualche indizio?

È stato utile?

Soluzione

Ho appena scritto un Post di blog su questo argomento, mentre ho incontrato il problema me stesso la scorsa settimana. Spiega come è possibile modificare i metadati generati da WCF in fase di esecuzione.

Oltre a scaricare il file di origine, devi solo aggiungere un attributo alla definizione del tuo contratto. In questo modo:

[ServiceContract]
[RequiredParametersBehavior]
public interface ICalculatorService
{
    [OperationContract]
    int Add(int firstValue, int secondValue);
}

Ecco il post sul blog che lo spiega in modo più dettagliato: Controllo di minOccurs WSDL con WCF

Altri suggerimenti

Verifica che MyComplexType sia contrassegnato con un attributo [DataContract].

Per il mio contratto WCF, ho scoperto che minOccurs = 1 non si sarebbe presentato per IsRequired = true nel wsdl generato fino a quando l'intera catena di oggetti implicati nel contratto non fosse contrassegnata come tale.

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