1

我正在尝试获取我在服务器上收到的数据合同对象,对其进行一些操作,然后返回它的升级版本,但它似乎不起作用。我可以通过使用 KnownType 或 ServiceKnownType 属性让它工作,但我不想往返所有数据。下面是一个例子:

[DataContract]
public class MyBaseObject
{
    [DataMember]
    public int Id { get; set; }
}

[DataContract]
public class MyDerivedObject : MyBaseObject
{
    [DataMember]
    public string Name { get; set; }
}


[ServiceContract(Namespace = "http://My.Web.Service")]
public interface IServiceProvider
{
    [OperationContract]
    List<MyBaseObject> SaveMyObjects(List<MyDerivedObject> myDerivedObjects);
}

public class ServiceProvider : IServiceProvider
{
    public List<MyBaseObject> SaveMyObjects(List<MyDerivedObject> myDerivedObjects)
    {
        ... do some work ...

        myDerivedObjects[0].Id = 123;
        myDerivedObjects[1].Id = 456;
        myDerivedObjects[2].Id = 789;

        ... do some work ...

        return myDerivedObjects.Cast<MyBaseObject>().ToList();
    }
}

任何人都知道如何让它工作而不必重新创建新对象或使用 KnownType 属性?

4

4 回答 4

0

我认为您的问题是您正在尝试通过通用列表发送。

如果您将列表封装在一个对象中,它将起作用。那就是创建一个具有单个公共属性的对象,即通用列表。

您还需要确保合同中未直接使用的所有类都标记为可序列化。

于 2009-06-21T21:28:39.383 回答
0

如果你想返回派生对象,那么总会有一个往返,因为客户端和服务是分开的。为了让客户端更新它自己的 MyBaseObjects 列表,它必须反序列化来自服务器的 MyDerivedObjects 列表。

需要使用 KnownType 和/或 ServiceKnownType,因为这会导致将该类型信息添加到 WSDL 中,然后客户端使用该信息将消息反序列化为正确的类型。

对于初学者来说,一个有用的工具来测试你所描述的场景:http ://www.wcfstorm.com

于 2009-06-22T06:30:09.247 回答
0

WCF(和 .net 远程处理)的问题之一是它们试图使“消息传递”看起来像方法调用。

当您尝试使用过多的“oop”类型设计时,这种情况就会失败。

消息由 .net 类表示的事实并没有 使它们的所有行为都像 .net 类。

有关泄漏抽象问题的更多信息,请参见thisthis 。

因此,在设计 WCF 接口时,您需要开始考虑消息传递而不是对象,否则您会遇到很多这样的问题。

于 2010-05-11T10:04:29.720 回答
0

您可以尝试创建一个 DataContractSurrogate (IDataContractSurrogate) 并返回您的基本类型以调用 GetDataContractType。我不确定这就是它的用途,所以你仍然可能会更好地使用“额外的工作”,但也许我不了解额外工作的范围。

于 2009-11-08T06:55:33.790 回答