我已经设计了很长一段时间的Web服务,但直到最近才开始提供“复杂的”WCF服务.我对WCF中对抽象类型明显缺乏“适当支持”感到困惑.当然 – 你可以使用它们 – 确保你可以让它们“工作”……你最终不会想到你想要的东西……
第一个问题是,如果从具有抽象类型的wsdl生成代码,则会得到截然不同的代码,因为它会回退到xmlserializer而不是DataContractSerializer.这显然有点不太理想……我想使用花哨的新的更快的序列化器,请谢谢…(以及Service / DataContract附带的所有内容)
另一方面 – 如果你先从代码开始并将正确归属的抽象wcf类暴露为Web服务,那么暴露的wsdl不包含abstract =“true”属性,使得“抽象类”在技术上具体……这不是我当然想要的……
我有一个解决方法,但它涉及一个疯狂的’hackery’我首先创建wsdl / xsd合同,删除任何abstract =“true”(哦 – 我不能提到我不能在xsd中使用属性然后svcuitl结果……但是现在我离开了带有CONCRETE抽象类的ac#api然后我需要修改它来添加抽象关键字…这个’有效’但它是一个巨大的皮塔饼 – 而且不容易’可编剧’……
这一切都被打破了!我希望有人可以向我解释’为什么’这是……我欢迎那些没有引用“可靠”资源的答案,但我真的在等待这个人告诉我 – 用适当的文件(比如来自好朋友Don Box本人)为什么这才是……因为我只是不明白……
谢谢大家 – 如果有人想了解更多细节 – 请告诉我!
更新样本请求的更新 – 以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>
解决方法
嗯,这是因为WCF不传递对象,它传递消息.这不是远程处理,因此客户端上的类型与服务器上的类型不同 – 它只是各种属性的保持类.实现“abstract =”true“根本没有意义.消息只是数据 – 客户端将如何知道要使用的具体类型,因为您不是在共享类,而只是表示消息.