Существующая инфраструктура
Есть java клиент который обращается к WCF сервису который через проксю (создана утилитой wsdl.exe по wsdl java сервиса) обращается к java сервису.
Суть проблемы. Необходимо настроить ответ от WCF сервиса клиенту чтобы он по формату на 100% к ответу java сервиса.
Пример.
ява сервис
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<tns:findInfoResponse xmlns:tns="http://ws.unisoft">
<tns:regionlist id="2821">
<tns:region code="56" sh="0">
<tns:pd innfl="тут инн" fio="тут фио" adrfl="" innpol="тут другой инн" kpppol="кпп">
</tns:region>
</tns:regionlist>
</tns:findInfoResponse>
</S:Body>
</S:Envelope>
Сейчас ответ выглядит так
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<findInfoResponse xmlns="http://ws.unisoft">
<findInfoResult i:type="a:RegionList" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:a="http://schemas.datacontract.org/2004/07/">
<a:id>1</a:id>
<a:region>
<a:Region>
<a:code>test</a:code>
<a:items xmlns:b="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
<b:anyType i:type="a:PD">
<a:fio i:nil="тут фио"/>
<a:innfl i:nil="тут инн"/>
<a:innpol i:nil="тут другой инн"/>
</b:anyType>
</a:items>
<a:sh>test</a:sh>
</a:Region>
</a:region>
</findInfoResult>
</findInfoResponse>
</s:Body>
</s:Envelope>
Т.е. необходимо чтобы поля обьекта записывались не отдельно а в качестве атрибута.
Здравствуйте, dima_diesel, Вы писали:
_>Используйте Message Contract
Попробовал, использовал тестовую структуру,но ничего не получилось
[DataContract]
[KnownTypeAttribute(typeof(TestStringContainer))]
[MessageContract]
public class TestStringContainer
{
[DataMember]
[MessageHeader]
public string Str { get; set; }
[DataMember]
[MessageBodyMember]
public string Str1 { get; set; }
[DataMember]
[MessageHeader]
public string Str2 { get; set; }
[MessageHeader]
[DataMember]
public string Str3 { get; set; }
[MessageBodyMember]
[DataMember]
public TestStringContainer container { get; set; }
}
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://ws.unisoft/IServiceNalog/findInfoResponse</Action>
</s:Header>
<s:Body>
<findInfoResponse xmlns="http://ws.unisoft">
<findInfoResult xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:d4p2="http://schemas.datacontract.org/2004/07/NalogProxyService.Services" i:type="d4p2:TestStringContainer">
<d4p2:Str>Строка внутри</d4p2:Str>
<d4p2:Str1>Вторая строка внутри</d4p2:Str1>
<d4p2:Str2 i:nil="true" />
<d4p2:Str3 i:nil="true" />
<d4p2:container>
<d4p2:Str>Строка дважды внутри</d4p2:Str>
<d4p2:Str1>Вторая строка дважды внутри</d4p2:Str1>
<d4p2:Str2 i:nil="true" />
<d4p2:Str3 i:nil="true" />
<d4p2:container i:nil="true" />
</d4p2:container>
</findInfoResult>
</findInfoResponse>
</s:Body>
</s:Envelope>
Здравствуйте, dima_diesel, Вы писали:
_>Используйте Message Contract
Проблема решилась навешиванием атрибута XmlAttribure над каждым полем обьекта. Плюс над атрибут XmlSerializerFormat над методом в интерфесе контракта.