Abbiamo un'interfaccia del servizio Web SOAP che vogliamo implementare usando WCF per una nuova applicazione. Questo sembra funzionare bene, tranne per un piccolo dettaglio. Lo spazio dei nomi XML del tipo restituito di una funzione deve essere diverso dallo spazio dei nomi XML del servizio Web stesso. E per la vita di me, non riesco a farlo funzionare.Come personalizzare la serializzazione XML WCF
Ho ricreato lo stesso problema con un piccolo progetto di esempio. L'interfaccia WCF:
[XmlSerializerFormat]
[ServiceContract(Namespace = "urn:outer-namespace")]
public interface IService1
{
[OperationContract]
MyClass DoStuff(int value);
}
[Serializable]
public class MyClass
{
[XmlElement(ElementName = "DataString")]
public string MyString { get; set; }
}
L'implementazione del servizio web:
public class Service1 : IService1
{
public MyClass DoStuff(int value)
{
return new MyClass { MyString = "Wooh!" };
}
}
Una risposta da questo webservice viene serializzato come: (roba SOAP Tralasciando)
<DoStuffResponse xmlns="urn:outer-namespace">
<DoStuffResult>
<DataString>Wooh!</DataString>
</DoStuffResult>
</DoStuffResponse>
ma vogliamo il <DoStuffResult> deve essere di xmlns = "urn: inner-namespace".
Ho provato ad aggiungere un [ritorno: XmlElement (...)] sulla funzione di interfaccia o sulla funzione di servizio Web, ma ciò non richiede. Anche un [XmlType] o [XmlRoot] nella definizione della classe MyClass non funziona.
Qualcuno ha un'idea su come modificare lo spazio dei nomi XML serializzato (o il nome dell'elemento) dell'oggetto che è il valore di ritorno di una funzione del servizio Web WCF?
Come ho già indicato nella domanda, ho provato ad aggiungere un attributo XmlRoot e non ha funzionato. Aggiunge solo lo spazio dei nomi ai campi all'interno di MyClass, ma non a MyClass stesso. Anche DataContract non funziona e preferisco XmlSerializer a causa della ridenominazione e l'ordine non è importante. –
Ho usato svcutil, ma senza specificare un serializzatore e ha generato una combinazione di MessageContract e ServiceContract con XmlSerializer. Quindi ha uno o due wrapper e potrei ancora usare gli attributi XML per far funzionare tutto. –