Служба WCF возвращает XML

#c# #xml #wcf

#c# #xml #wcf

Вопрос:

У меня есть, на мой взгляд, довольно простой вопрос, но я не смог найти ответы в Интернете. У меня есть служба WCF, которая принимает три параметра и возвращает список чисел (идентификаторов). На данный момент три входящих параметра полностью игнорируются, и я просто тестирую возвращаемые значения. Здесь я сталкиваюсь со своей проблемой. Мне нужно вернуть в XML список идентификаторов кандидатов. Спецификации требуют, чтобы список выглядел следующим образом:

 <Disabled>
       <Candidate>123456789</Candidate>
       <Candidate>ABCDEFGHI</Candidate>
</Disabled>
  

Как я могу заставить службу WCF возвращать данные таким образом. При использовании списка данные возвращаются следующим образом:

 <Disabled>
     <Candidate>
            <a:string>test</a:string>
            <a:string>test1</a:string>
     </Candidate>
<Disabled>
  

Есть ли какой-либо способ изменить это, чтобы вернуть, как показано выше, не запрашивая у наших клиентов изменения спецификаций на их стороне?

Вот мои контракты с данными как для запроса, так и для ответа:

  [DataContract]
    public class RequestDeactivated
    {
        [DataMember(Order = 0)]
        public string companyId { get; set; }
        [DataMember(Order = 1)]
        public string companyToken { get; set; }
        [DataMember(Order = 2)]
        public int verificationToken { get; set; }
    }

    [DataContract]
    public class ResponseDeactivated
    {
        [DataMember]
        public List<string> Candidate { get; set; }

    }
  

Я никогда не создавал службу, которая возвращает подобный список, поэтому буду признателен за любую помощь.
Спасибо

Редактировать: я включил код, который обрабатывает то, что фактически возвращается. Пожалуйста, обратите внимание, что на данный момент я просто тестирую и не добавил сюда логику.

 public ResponseDeactivated Deactivate(RequestDeactivated data)
{
    ResponseDeactivated d = new ResponseDeactivated();
    d.Candidate = new List<string>();
    d.Candidate.Add("test");
    d.Candidate.Add("test1"); 
    return d;
}
  

Комментарии:

1. Возврат ResponseDeactivated Нет необходимости иметь дело с xml. Эти фреймворки предназначены для выполнения этих работ (xml / json serializetion / deserializetion и т.д.) За вас.

2. Когда я просто возвращаю ResponseDeactivated, я получаю отформатированную строку a :, которая мне не нужна. Я обновлю свой вопрос, чтобы отображался мой код, обрабатывающий то, что возвращается прямо сейчас

Ответ №1:

Настройте свой корневой узел как набор строк, в котором каждый элемент в коллекции имеет имя элемента «Кандидат».

 [CollectionDataContract(ItemName = "Candidate")]
public class ResponseDeactivated : Collection<string>
{

}
  

Затем вы можете выполнить сериализацию следующим образом:

 ResponseDeactivated o = new ResponseDeactivated();
o.Add("123456789");
o.Add("ABCDEFGHI");

DataContractSerializer serializer = new DataContractSerializer(typeof(ResponseDeactivated));            

serializer.WriteObject(stream, o);
  

Комментарии:

1. Сейчас разбираюсь в этом. Большое вам спасибо за ваш ответ. Я дам вам знать, если это сработает, и отмечу это как ответ.

2. РЕДАКТИРОВАТЬ: Ваше решение сработало! Большое вам спасибо. Проведя небольшое исследование, я обнаружил, что мне даже не нужно было сериализовать ResponseDeativated. Кажется, что все улажено за меня. Я просто изменил DataContract на CollectionDataContract и удалил элемент данных, который у меня был. Если у кого-то еще есть вопросы, я буду рад загрузить для них свой рабочий код. Еще раз спасибо