以下是示例:
[ServiceKnownType("GetKnownTypes", typeof(Helper))]
[ServiceContract]
public interface ICommunicationService
{
[WebInvoke(Method = "POST",
ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Bare,
UriTemplate = "/SendMessage")]
string SendMessage(BusMessage message);
}
[DataContract]
[Serializable]
public abstract class BusMessage
{
[DataMember(Name = "uid")]
public string Id { get; set; }
}
GetKnownTypes返回BusMessage的所有子类型。
如果我从wsdl生成客户端,一切正常。类已正确转换和序列化。
当我尝试使用外部的东西时出现问题,例如来自Chrome的Postman。
我收到一个异常,即抽象类无法实例化。
我注意到那个字段" __ type"从我的客户端序列化时添加到json字符串。
它包含如下消息类型:BusTextMessage#namespace。
我尝试将此手动添加为另一个字段,但它没有帮助。如何解决这样的问题?
我不应该使用抽象类/接口作为参数吗?
答案 0 :(得分:0)
当您发送"对象"到WCF服务,不是发送真实对象,而是序列化和反序列化数据。您可以看到这一点,因为客户端在导入服务引用时只有一个没有任何方法和底层逻辑的存根类。
客户端/服务尝试创建具体类的实例并从数据中反序列化它们。由于您无法创建抽象类的实例,因此您无法通过"传递"通过WCF调用方法的抽象类。
此外:抽象的课程并不真正有意义,至少在你提供的例子中是这样。如上所述,数据协定类中的逻辑不会传播到客户端,因此最好不要在其中包含任何逻辑(方法,复杂的getter / setter)。如果你介意的话,那就没理由上课abstract
。