Mamy istniejący interfejs usługi WWW SOAP, który chcemy zaimplementować przy użyciu WCF dla nowej aplikacji. Wydaje się, że działa dobrze, z wyjątkiem jednego małego szczegółu. Przestrzeń nazw XML zwracanego typu funkcji musi być inna niż przestrzeń nazw XML samej usługi WWW. I dla mojego życia, nie mogę zmusić go do działania.Jak dostosować serializację XML WCF
Odtworzyłem ten sam problem z małym przykładowym projektem. Interfejs 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; }
}
Realizacja serwis internetowy:
public class Service1 : IService1
{
public MyClass DoStuff(int value)
{
return new MyClass { MyString = "Wooh!" };
}
}
Odpowiedź z tym usługa jest następnie szeregowane jako: (pomijając SOAP rzeczy)
<DoStuffResponse xmlns="urn:outer-namespace">
<DoStuffResult>
<DataString>Wooh!</DataString>
</DoStuffResult>
</DoStuffResponse>
Ale chcemy <DoStuffResult> należy do xmlns = "urn: inner-namespace".
Próbowałem dodać [return: XmlElement (...)] na funkcji interfejsu lub funkcji usługi sieciowej, ale to nie bierze. Również [XmlType] lub [XmlRoot] w definicji klasy MyClass nie działa.
Czy ktoś ma pomysł, jak zmienić spersonalizowaną przestrzeń nazw XML (lub nazwę elementu) obiektu, który jest zwracaną wartością funkcji usługi WWW WCF?
Tak jak już wspomniano w pytaniu, próbowałem dodając atrybut XmlRoot i to nie działa. Dodaje tylko przestrzeń nazw do pól w MyClass, ale nie do samej MyClass. DataContract również nie działa, a ja wolę XmlSerializer, ponieważ zmiana nazwy i kolejność nie jest wtedy ważna. –
Użyłem svcutil, ale bez określenia serializera i wygenerowałem kombinację MessageContract i ServiceContract z XmlSerializer. Więc ma jedną lub dwie owijki i wciąż mógłbym używać atrybutów XML, aby wszystko działało. –