Использование универсального объекта для возврата данных из метода веб-сервиса? - PullRequest
2 голосов
/ 24 ноября 2010

У меня есть веб-сервис ASMX с несколькими методами, которые будут возвращать XML.

Сервис возвращает различные объекты, и я создал объект-обертку, который содержит информацию о запросе, например:

[Serializable]
[XmlRoot("response")]
public class DtoWrapper<T>
{
    [XmlElement("error")]
    public bool Error { get; set; }

    [XmlElement("error_message")]
    public string ErrorMessage { get; set; }

    [XmlElement("success")]
    public bool Success { get; set; }

    [XmlElement("friendly_message")]
    public string FriendlyMessage { get; set; }

    [XmlArray("result")]
    [XmlArrayItem("item")]
    public List<T> Payload { get; set; }
}

Теперь это работает нормально, пока я не определил второй метод с другим типом. Затем я получаю эту ошибку при попытке загрузить тестовую страницу ASMX

Верхний элемент XML 'response' из пространства имен 'http://tempuri.org/' ссылки на различные типы MyProject.Web.webservices.DtoWrapper 1[MyProject.BusinessLogic.ClassA] and MyProject.Web.webservices.DtoWrapper 1 [MyProject.BusinessLogic.ClassB]. Используйте атрибуты XML для указания другого Имя XML или пространство имен для элемента или типы.

Я пытался пометить мои объекты с помощью [XmlType(Namespace="com.temp.A")] и [XmlType(Namespace="com.temp.B")], но, похоже, это не помогает.

Есть идеи? Нужно ли создавать объект-оболочку для каждого типа, который я хочу использовать?

EDIT : Я понял, что проблема заключается не в аргументах типа. Это факт, что тег [XmlRoot] указан в классе. Сериализатор рассматривает их как 2 типа, но они имеют одинаковый корневой элемент в одном и том же пространстве имен.

1 Ответ

0 голосов
/ 24 ноября 2010

Вы не можете сделать это.XML не имеет понятия обобщений, как и XML-схема или SOAP.Что касается XML-схемы, то если у нее одинаковое имя элемента и одно и то же пространство имен, то это одно и то же.

У вас не может быть общего веб-сервиса, поскольку концепции не существует.

...