将抽象类作为方法参数的WCF服务
本文关键字:WCF 服务 参数 方法 抽象类 | 更新日期: 2023-09-27 18:22:23
以下是示例:
[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#命名空间。
我试图手动将其添加为另一个字段,但没有帮助。如何解决这样的问题?
我不应该使用抽象类/接口作为参数吗?
当您向WCF服务发送"对象"时,不会发送真正的对象,而是序列化和反序列化数据。您可以看到,当您导入服务引用时,客户端只有一个存根类,没有任何方法和底层逻辑。
客户端/服务尝试创建具体类的实例,并从数据中反序列化它们。由于不能创建抽象类的实例,因此不能通过WCF将抽象类"传递"给方法调用。
此外:抽象的类实际上没有意义,至少在您提供的示例中没有意义。正如我上面所说,数据契约类中的逻辑不会传播到客户端,因此最好根本不包含任何逻辑(方法、复杂的getter/setter)。如果你介意的话,没有理由让类abstract
。