WCF настроить формат ответа
От: EnDimeon Россия  
Дата: 27.04.10 07:13
Оценка:
Существующая инфраструктура
Есть 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>


Т.е. необходимо чтобы поля обьекта записывались не отдельно а в качестве атрибута.
- Что пишешь?
— Незнаю, щас откомпилируем, увидим.
Re: WCF настроить формат ответа
От: dima_diesel Россия  
Дата: 27.04.10 07:31
Оценка:
Используйте Message Contract
Re[2]: WCF настроить формат ответа
От: EnDimeon Россия  
Дата: 27.04.10 08:15
Оценка:
Здравствуйте, 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>
- Что пишешь?
— Незнаю, щас откомпилируем, увидим.
Re[2]: WCF настроить формат ответа
От: EnDimeon Россия  
Дата: 27.04.10 09:34
Оценка:
Здравствуйте, dima_diesel, Вы писали:

_>Используйте Message Contract


Проблема решилась навешиванием атрибута XmlAttribure над каждым полем обьекта. Плюс над атрибут XmlSerializerFormat над методом в интерфесе контракта.
- Что пишешь?
— Незнаю, щас откомпилируем, увидим.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.