Скажем, у меня есть объект Person, который имеет имя, фамилию и возраст.Я хочу отправить этот объект person в веб-сервис, который знает и заботится только об объекте person с именем и фамилией.Но я хочу, чтобы xml, представляющий полный объект человека, включая возраст, был отправлен обратно.
У меня уже есть механизм для хранения XML в объекте за кулисами, и я могу просто обслуживать этот XML до WCF, но я не хочу использовать обычный XmlSerializer.Я хочу быть в состоянии сказать "вот XML. Заверните его в мыло и отправьте его".
Я планирую использовать WCF.Где бы я подключился к этому процессу, чтобы контролировать сериализацию?
Подробнее
Пока пример в этом вопросе надуман.Это ясно иллюстрирует мою проблему.Допустим, у меня есть приложение с таким классом:
/* person A */
class Person {
public string FirstName { get; set; }
public string LastName { get; set; }
public int Age { get; set; }
}
Я передаю это веб-службе.Веб-сервис знает о другом классе Person, записанном как:
/* person B */
class Person {
public string FirstName { get; set; }
public string LastName { get; set; }
}
В сервисе есть метод со следующей сигнатурой метода:
Person SomeOperation(Person p);
Когда я вызываю этот веб-сервис из моего приложенияи передать его моей личности версия, веб-сервис получает это просто отлично.Он игнорирует свойство Age.Но когда он воссоздает ответ, свойство Age исчезает.
Я понимаю , почему это происходит.WCF десериализует ответ в фактический объект c #, поэтому лишний XML, отправленный с запросом, отбрасывается.Из-за этого нет свойства Age для отправки обратно.
У меня есть механизм, чтобы фактически использовать XML в качестве резервного хранилища для моих объектов.Если в резервном хранилище есть XML, который не нужен объекту, он просто находится там и не используется.Я хочу, чтобы полный XML-код, используемый в качестве резервного хранилища, отправлялся обратно в ответе.
Если бы это было базовое приложение на c #, я мог бы просто создать интерфейс IBasicPerson, который содержит свойства FirstName и LastName и имеет класс Personреализовать интерфейс, как показано ниже:
public interface IBasicPerson {
string FirstName { get; set; }
string LastName { get; set; }
}
public class Person : IBasicPerson {
public string FirstName { get; set; }
public string LastName { get; set; }
public int Age { get; set; }
}
тогда я мог бы создать операцию в каком-то другом классе, который принимает и возвращает интерфейс IBasicPerson:
public SomeClass {
public IBasicPerson SomeOperation(IBasicPerson p) {
/* do stuff */
return p;
}
}
Когда я вызываю это, онне заботится о собственности Age, и информация не теряется.Это связано с тем, что и IBasicPerson в SomeOperation, и фактический переданный экземпляр Person ссылаются на один и тот же объект.Однако это не относится к случаям, когда вызовы WCF выполняются по проводам.
С точки зрения приложения, вызывающего службы WCF, объект в возвращаемом значении метода не является тем же объектом, который был передан.
Мое хранилище XML-данных решает эту проблему, но только если я смогу выяснить, как предотвратить его потерю.Вот почему я пытаюсь выяснить, где я должен подключиться к процессу сериализации WCF.