Почему я не могу выставить интерфейс в.NET asmx веб-сервис?

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

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

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

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

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

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

7
задан mcliedtk 5 April 2010 в 21:40
поделиться

3 ответа

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

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

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

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

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

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

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

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

10
ответ дан 6 December 2019 в 23:04
поделиться

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

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

-1
ответ дан 6 December 2019 в 23:04
поделиться

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

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

2
ответ дан 6 December 2019 в 23:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: