Я давно занимаюсь разработкой веб-сервисов, но до недавнего времени мне никогда не приходилось предоставлять «сложные» сервисы 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>