Почему я не могу предоставить интерфейс в веб-сервисе .NET asmx? - PullRequest
7 голосов
/ 06 апреля 2010

У меня есть веб-служба .NET (использующая asmx ... еще не обновлена ​​до WCF), которая предоставляет следующее:

public class WidgetVersion1 : IWidget {}
public class WidgetVersion2 : IWidget {}

Когда я пытаюсь привязаться к веб-службе, я получаюследующая ошибка сериализации:

Невозможно сериализовать элемент WidgetVersion1 типа IWidget, потому что это интерфейс.

Я пытался добавить различные атрибуты в интерфейс IWidget (XmlIgnore,SoapIgnore, NonSerialized), но они недействительны для интерфейса.

Кто-нибудь знает, почему я не могу открыть интерфейс?Я предполагаю, что WSDL не поддерживает интерфейсы, но .NET не может обойти это, просто не сериализовав интерфейс?Есть ли способы обойти это, кроме удаления интерфейса IWidget из определений классов WidgetVersion1 и WidgetVersion2?

Ответы [ 3 ]

10 голосов
/ 06 апреля 2010

WCF также не может сериализовать интерфейс; фактически невозможно сериализовать интерфейс через SOAP.

Причина (упрощенная) в том, что при десериализации 1004 * .NET должна иметь возможность создать какой-то конкретный конкретный класс. Интерфейс - это абстрактное понятие; за ним всегда должна быть «реальная» реализация класса, чтобы фактический экземпляр существовал.

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

Если вы пытаетесь использовать XmlIgnoreAttribute, помните, что применение его к типу ничего не даст. Вместо этого его необходимо применить к member . Другими словами:

public class SerializableClass
{
    [XmlElement]
    public int ID { get; set; }

    [XmlElement]
    public string Name { get; set; }

    [XmlIgnore]
    public IMyInterface Intf { get; set; }
}

... будет сериализовано ОК, потому что сериализатор не будет пытаться сериализовать свойство Intf. Вы просто не можете добавить атрибут [XmlIgnore] в определение типа IMyInterface (он не скомпилируется).

2 голосов
/ 06 апреля 2010

Создайте функцию AsIWigit (), которая возвращает класс частного моста, который реализует указанный интерфейс.

Это обеспечит способ преобразования этих классов в соответствующий интерфейс по мере необходимости и будет работать со службами ASMX.

0 голосов
/ 06 апреля 2010

Поскольку интерфейсы не могут быть сериализованы.

См. веб-сервис не может сериализовать интерфейс

...