当前位置:  开发笔记 > 编程语言 > 正文

为什么WCF在托管为Web服务时"正确"使用/公开抽象类型

如何解决《为什么WCF在托管为Web服务时"正确"使用/公开抽象类型》经验,为你挑选了1个好方法。

我已经设计了很长一段时间的Web服务,但直到最近才开始提供"复杂的"WCF服务.我对WCF中对抽象类型明显缺乏"适当支持"感到困惑.当然 - 你可以使用它们 - 确保你可以让它们"工作"......你最终不会得到你想要的东西......

第一个问题是,如果从具有抽象类型的wsdl生成代码,则会得到截然不同的代码,因为它会回退到xmlserializer而不是DataContractSerializer.这显然有点不太理想......我想使用花哨的新的更快的序列化器,请谢谢...(以及Service/DataContract附带的所有内容)

另一方面 - 如果你先从代码开始并将正确归属的抽象wcf类暴露为Web服务,那么暴露的wsdl不包含abstract ="true"属性,使得"抽象类"在技术上具体......这不是我当然想要的......

我有一个解决方法,但它涉及一个疯狂的'hackery'我首先创建wsdl/xsd合同,删除任何abstract ="true"(哦 - 我不能提到我不能在xsd中使用属性然后svcuitl结果......但是现在我离开了ac#api,它有一个CONCRETE抽象类,然后我需要修改它来添加抽象关键字......这个'有效'但它是一个巨大的皮塔 - 而且不容易'可编写脚本'......

这一切都被打败了!我希望有人可以向我解释'为什么'这是......我欢迎那些没有引用"可靠"资源的答案,但我真的在等待这个人告诉我 - 用适当的文件(比如来自好朋友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
  }
}

预期类型:

 
  
    
  

实际发射类型:

 
  
    
  

blowdart.. 5

嗯,这是因为WCF不传递对象,它传递消息.这不是远程处理,因此客户端上的类型与服务器上的类型不同 - 它只是各种属性的保持类.实现"abstract ="true"根本就没有意义.消息只是数据 - 客户端如何知道要使用的具体类型,因为您不是在共享类,而只是消息的表示.



1> blowdart..:

嗯,这是因为WCF不传递对象,它传递消息.这不是远程处理,因此客户端上的类型与服务器上的类型不同 - 它只是各种属性的保持类.实现"abstract ="true"根本就没有意义.消息只是数据 - 客户端如何知道要使用的具体类型,因为您不是在共享类,而只是消息的表示.


我非常感兴趣地阅读了这篇文章,我认为你错过了创建WCF以与平台无关的基本观点.抽象/多态是一个OO概念,因此并未在所有语言中实现.从理论上看,这种服务可以被任何语言使用,包括那些不支持OO原则的语言,你会使这项服务与这些语言不兼容.
推荐阅读
惬听风吟jyy_802
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有