【问题标题】:WCF return Class with object fieldWCF返回带有对象字段的类
【发布时间】:2014-07-29 12:02:39
【问题描述】:

我有一个用作 RestApi 的 Wcf 服务

[KnownType(typeof(myClass1))]
[KnownType(typeof(myClass2))]
[KnownType(typeof(myClassAndOther23typesOmmited))]
[DataContract]
public class ApiResult
{
    [DataMember]
    public bool Success { get; private set; }

    [DataMember]
    public object Result { get; private set; }
}

字段Result 是有问题的部分,它不能被序列化,因为它是一个对象类型。所以问题是,如何返回正确的ApiResult 对象。

注意

虽然有KnownTypeAttribute,但当我尝试将string[] 分配给ApiResult Result 字段并返回给客户端时,服务会抛出SerializationException

更新

尝试后ApiResult<T> 服务编译成功,智能感知给出了这个

经过几次调查,收集到这些奇怪的类型名称是为了避免服务中的冲突(它是简单的类型哈希码,由字面 objectGetHash() 实现),

这是对 nvoigt 解决方案的回应,因为无法插入图片来评论

【问题讨论】:

    标签: c# wcf datacontract datamember


    【解决方案1】:

    为什么不创建一个通用的 ApiResult:

    [DataContract]
    public class ApiResult<T>
    {
        [DataMember]
        public bool Success { get; internal set; }
    
        [DataMember]
        public T Result { get; internal set; }
    }
    

    这样,您的方法实际上可以返回像 ApiResult&lt;myClass1&gt; 这样的类型值,而您根本不需要任何 KnownTypes。

    【讨论】:

    • 当时我正在调查这种情况,但看起来很有希望。
    • @evc 这是您的客户端服务参考向导,可以理解 WSDL 描述。如果你也想在客户端使用泛型,你应该有一个契约程序集在客户端和服务之间共享。
    • 所以如果我选择这个解决方案,我最终会产生依赖,而其他客户端(比如说移动平台)将无法获得一致的服务,顺便说一句,这不是我想要移动的方式。是否有任何其他解决方案可以让所有其他独立平台接受我的服务?
    • @evc 它到底有什么不一致的地方?如果你使用 C# 作为客户端,你可以拥有泛型,如果你不想要或者不想要合约依赖,你将不得不使用选择的平台特性。他们很可能会为您使用的每个泛型类型生成一个类型。否则你会怎么做,有些语言没有泛型或以不同方式处理泛型。通用类型安全比仅仅传输一个对象要好得多,希望对方知道是什么意思。
    • 所以你说没有泛型就没有真正好的解决方案。我真的必须让我的 IIS 服务器成为我的 wcf 服务和其他平台之间的门。对吗?
    猜你喜欢
    • 1970-01-01
    • 2017-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-25
    • 2023-04-05
    • 2017-01-01
    相关资源
    最近更新 更多