gpt4 book ai didi

c# - 具有抽象类作为方法参数的 WCF 服务

转载 作者:太空宇宙 更新时间:2023-11-03 15:50:50 24 4
gpt4 key购买 nike

例子如下:

[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。

我尝试将其手动添加为另一个字段,但无济于事。如何解决这样的问题?

我不应该使用抽象类/接口(interface)作为参数吗?

最佳答案

当您将“对象”发送到 WCF 服务时,发送的不是真正的对象,而是数据序列化和反序列化。您可以看到,当您导入服务引用时,客户端只有一个 stub 类,没有任何方法和底层逻辑。

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

此外:抽象的类实际上没有意义,至少在您提供的示例中没有意义。正如我上面所说,数据契约类中的逻辑不会传播到客户端,所以最好不要在其中包含任何逻辑(方法、复杂的 getter/setter)。如果您介意这一点,则没有理由将类设为抽象

关于c# - 具有抽象类作为方法参数的 WCF 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25910529/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com