ПОЧЕМУ WCF не 'правильно' потребляет / выставляет абстрактные типы при размещении в виде веб-службы - PullRequest
9 голосов
/ 08 мая 2009

Я давно занимаюсь разработкой веб-сервисов, но до недавнего времени мне никогда не приходилось предоставлять «сложные» сервисы WCF. Я был озадачен очевидным отсутствием «надлежащей поддержки» в WCF для абстрактных типов. Конечно, вы можете ИСПОЛЬЗОВАТЬ их, конечно, вы можете заставить их «работать» ... вы просто не получите то, что ХОТИТЕ ...

Первая проблема состоит в том, что если вы генерируете код из wsdl с абстрактным типом, вы получаете совершенно другой код, потому что он возвращается к xmlserializer, а не к DataContractSerializer. Очевидно, это немного меньше, чем хотелось бы ... Я хотел бы использовать новый, более быстрый сериализатор, пожалуйста, спасибо ... (и все, что идет вместе с Service / DataContract)

с другой стороны - если вы сначала начнете с кода и выставите правильно приписанный абстрактный класс wcf как веб-сервис, то открытый wsdl НЕ содержит атрибут abstract = "true", делающий "абстрактный класс" технически конкретным ... Это не то, что я хочу, конечно ...

У меня есть обходной путь, но он включает в себя сумасшедшее количество "хакерских атак", когда я сначала создаю контракт wsdl / xsd, удаляю любой абстрактный = "true" (о, давайте не будем упоминать, что я не могу использовать атрибуты в xsd, мы должны) и затем svcuitl результат ... Но теперь я остался с ac # api, у которого есть абстрактный класс CONCRETE, и мне тогда нужно изменить это, чтобы ДОБАВИТЬ абстрактное ключевое слово ... Это 'работает', но это огромный лаваш, и его нелегко «написать» ...

Это все просто разбито! Я надеюсь, что кто-то может объяснить мне точно, «почему» это ... Я приветствую ответы, которые не ссылаются на «твердые» ресурсы, но я действительно жду, когда человек скажет мне - с надлежащей документацией (например, предпочтительно от добрый ол Дон Бокс сам) почему именно это ... Потому что я просто не понимаю ...

Спасибо всем - если кому-то захочется больше подробностей - пожалуйста, дайте мне знать!

ОБНОВЛЕНО ДЛЯ ДОБАВЛЕНИЯ ЗАПРОСА ОБРАЗЦА - начиная с c #

[ServiceContract]
public interface IShapeTest
{
  [OperationContract]
  AbsShape EchoShape(AbsShape shape);
}

public class ShapeTestImpl : IShapeTest
{
  public AbsShape EchoShape(AbsShape shape)
  {
    return shape;
  }
}

[KnownType(typeof(Square))]
public abstract class AbsShape
{
  [DataMember]
  public int numSides;
}

public class Square : AbsShape
{
  public Square() : base()
  {
    numSides = 4;//set the numSides to 'prove' it works
  }
}

ОЖИДАЕМЫЙ ТИП:

<xs:complexType name="AbsShape" abstract="true"> <!--NOTE abstract="true"-->
  <xs:sequence>
    <xs:element minOccurs="0" name="numSides" type="xs:int"/>
  </xs:sequence>
</xs:complexType>

ФАКТИЧЕСКИЙ ВЫПУСКАННЫЙ ТИП:

<xs:complexType name="AbsShape"> <!--NOTE the lack of abstract="true"-->
  <xs:sequence>
    <xs:element minOccurs="0" name="numSides" type="xs:int"/>
  </xs:sequence>
</xs:complexType>

Ответы [ 5 ]

5 голосов
/ 15 мая 2009

Ну, это потому, что WCF не пропускает объекты, он пропускает сообщений . Это не является удаленным, поэтому тип в конечном итоге на клиенте не совпадает с типом на сервере - это просто класс хранения для различных свойств. Реализация «abstract =» true »просто не имеет смысла. Сообщения - это просто данные - как клиент узнает, какой конкретный тип использовать, поскольку вы не разделяете классы, а просто представляете сообщение.

2 голосов
/ 15 мая 2009

«аннотация» - это деталь реализации. Ему не место в сервисном контракте. Естественно, как только вы настаиваете, что вызывающая сторона должна знать, что вы возвращаете абстрактный тип, WCF должен использовать сериализатор, который может раскрыть этот факт: и вы снова застряли с XmlSerializer.

Я подозреваю, что вы используете абстрактный, потому что это ОО способ делать вещи. Но вы не делаете OO, вы делаете веб-сервисы - SOA. Есть разница.

1 голос
/ 11 января 2014

Атрибут «abstract = true» для абстрактных типов, а также наследование типа сохраняется в WSDL при использовании Java EE. Любое использование традиционных ключевых слов Java, таких как "abstract" или "extends" в объектных моделях, сохраняется в WSDL и XSD. Никаких специальных атрибутов или искажения не требуется.

Службам WCF не удается сгенерировать абстрактный атрибут в WSDL. WCF также не может пройти через наследование объектной модели, требуя использования атрибута KnownTypeAttribute, чтобы правильное наследование XSD привело к WSDL.

Однако клиенты WCF будут генерировать абстрактные типы из WSDL из службы, которая описывает некоторые типы как абстрактные, а также сохраняет наследование для любого типа (используя «Ссылку на службу» в Visual Studio для настройки клиента на службу Java EE). например).

Таким образом, WCF учитывает абстрактные типы, определенные в WSDL для клиентского прокси, но не создает абстрактные типы в службе для создания WSDL (возможно, без особого внимания, такого как KnownTypeAttribute, необходимый для наследования).

1 голос
/ 17 августа 2011

Предпосылка этого вопроса заключается в том, что WCF должен отобразить элемент XSD complexType с абстрактным атрибутом, установленным в true, как абстрактный класс C #. Если вы посмотрите на спецификацию WSDL о будущей расширяемости, вы увидите пример того, как спецификация использует эту функцию XSD, чтобы разрешить добавление «элементов» без необходимости изменять саму спецификацию WSDL.

Цель абстрактного атрибута XSD - позволить другим "типам" XSD наследовать определения от базового типа. Это может звучать как то, что @dovholuk ищет для WCF, но на самом деле это устройство для определения типа XSD. Эта функция XSD не имеет отношения к сериализации XML в конструкции класса C #, поскольку она предназначена для использования в определениях XSD. Итак, суммируя @blowdart и @JohnSaunders, WCF - это абстракция над обменом сообщениями, в которой определение типа на основе XSD является подробностью реализации.

0 голосов
/ 03 мая 2013

Использовать атрибут [XmlSerializerFormat]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...