Почему я не могу предоставить интерфейс в a.NET веб-служба asmx?
у меня есть веб-служба .NET (используя asmx...еще не обновлен до WCF), который предоставляет следующее:
public class WidgetVersion1 : IWidget {}
public class WidgetVersion2 : IWidget {}
когда я пытаюсь привязаться к веб-службе, я получаю следующую ошибку сериализации:
не удается сериализовать член WidgetVersion1 типа IWidget, поскольку это интерфейс.
Я попытался добавить различные атрибуты в интерфейс IWidget (XmlIgnore
, SoapIgnore
, NonSerialized
), но они не действуют на взаимодействие.
кто-нибудь знает почему я не могу выставить интерфейс? Я предполагаю, что WSDL не поддерживает интерфейсы, но не может .NET обойти это, просто не сериализуя интерфейс? Есть ли какие-либо способы обойти это, кроме удаления интерфейса IWidget из определений классов WidgetVersion1 и WidgetVersion2?
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
собственность. Вы просто не можете добавить до IMyInterface
определение типа (оно не будет компилироваться).
сделайте функцию AsIWigit (), которая возвращает частный класс моста, реализующий указанный интерфейс.
Это обеспечит способ преобразования этих классов в соответствующий интерфейс по мере необходимости и будет работать со службами ASMX.
потому что интерфейсы не могут быть сериализованы.
посмотреть веб-служба не может сериализовать интерфейс