#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 и удалил элемент данных, который у меня был. Если у кого-то еще есть вопросы, я буду рад загрузить для них свой рабочий код. Еще раз спасибо