将抽象类作为方法参数的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服务发送"对象"时,不会发送真正的对象,而是序列化和反序列化数据。您可以看到,当您导入服务引用时,客户端只有一个存根类,没有任何方法和底层逻辑。

客户端/服务尝试创建具体类的实例,并从数据中反序列化它们。由于不能创建抽象类的实例,因此不能通过WCF将抽象类"传递"给方法调用。

此外:抽象的类实际上没有意义,至少在您提供的示例中没有意义。正如我上面所说,数据契约类中的逻辑不会传播到客户端,因此最好根本不包含任何逻辑(方法、复杂的getter/setter)。如果你介意的话,没有理由让类abstract