Где я могу подключиться к ответу WCF SOAP, чтобы сгенерировать XML для возвращаемого объекта? - PullRequest
0 голосов
/ 02 декабря 2011

Скажем, у меня есть объект 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.

Ответы [ 2 ]

5 голосов
/ 02 декабря 2011

При работе с WCF вы обычно не работаете с XML.Вы работаете с объектами и позволяете WCF сериализовать объекты на основе конфигурации.Таким образом, одна и та же служба может работать с SOAP через HTTP, или с двоичным кодом через TCP / IP, или с чем-то еще, с одним и тем же кодом.

2 голосов
/ 09 декабря 2011

Проверьте интерфейс IExtensibleDataObject - это может быть именно то, что вам нужно!

Это позволяет службе WCF «спрятать» любую дополнительную информацию, которая поступает, и передать ее вызывающей стороне при ответе на вызов службы, не зная, что именно она хранит.Он часто используется для управления версиями ваших служб - поэтому, если для новой версии службы требуются дополнительные параметры, они также могут быть переданы в более старую службу и временно сохранены в ExtensionDataObject реализации вашей службы.

...