Silverlight WCF服务消耗datacontract中的继承类型

时间:2010-01-24 01:20:13

标签: wcf silverlight serialization datacontract

我试图在Silverlight中使用WCF服务......

我所做的是为我的datacontracts创建两个单独的程序集......

  1. 包含标有数据合同的所有类型的程序集.Net 3.5

  2. 一个Silverlight程序集,它链接到第一个程序集中的文件。

  3. 这意味着我的.Net应用程序可以引用程序集1和我的silverlight app程序集2.这样可以正常工作,我可以通过该服务进行通信。

    当我尝试转移继承的分类时会出现问题。我有以下课程结构...

    IFlight - 适用于所有类型航班的界面。

    BaseFlight:IFlight - 基地飞行实施IFlight

    AdhocFlight:BaseFlight,IFlight - adhoc航班继承自baseflight并实施IFlight。

    我可以成功转移整个服务的基本航班。但是我真的需要能够在界面上传输IFlight的对象,因为我想要一个可以传输多种类型的飞行的操作合同......

    public IFlight GetFlightBooking()
    {
        AdhocFlight af = new AdhocFlight();
        return af;
    }
    

    ......我觉得应该工作吗?

    然而我收到错误:

    “服务器没有提供有意义的回复;这可能是由于合同不匹配,过早的会话关闭或内部服务器错误造成的。”

    任何想法都会受到赞赏。

3 个答案:

答案 0 :(得分:4)

你说BaseFlight有效;你的基类命名为已知类型吗?

[DataContract]
[KnownType(typeof(AdhocFlight))]
class BaseFlight : IFlight {...}

您可能还想查看[ServiceKnownType]。在 general 中,WCF不会喜欢基于接口的方法(IFlight),因为它想要确切地知道它对数据的期望(de)序列化;我希望它可以在上面使用BaseFlight并在API上使用。

答案 1 :(得分:1)

我认为你想要做的是“正常”的.NET WCF。这是一个讨论在WCF服务中传递接口的问题:
Passing Interface in a WCF Service?

但我很怀疑这是否适用于Silverlight。至少可以说,SL中的WCF支持是粗略的。我没有尝试过。我可能错了。

答案 2 :(得分:0)

这可能与WCF中序列化通用接口类型的错误有关,也可能与此无关。

http://connect.microsoft.com/VisualStudio/feedback/details/391260/executionengineexception-thrown-from-datacontractserializer-with-ilist-t

如果这与您的问题有关,您会很高兴听到它已修复.net 4.0