我正在尝试接收我在服务器上收到的datacontract对象,对它进行一些操作,然后返回它的上传版本,但它似乎不起作用。我可以通过使用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属性的情况下使其工作?
答案 0 :(得分:0)
我认为您的问题是您尝试发送通用列表。
如果将列表封装在对象中,它将起作用。那就是创建一个具有单个公共属性的对象,这是一个通用列表。
您还需要确保合同中未直接使用的所有类都标记为可序列化。
答案 1 :(得分:0)
如果要返回派生对象,则始终会有往返,因为客户端和服务是分开的。为了让客户端更新自己的MyBaseObjects列表,它必须反序列化来自服务器的MyDerivedObjects列表。
需要使用KnownType和/或ServiceKnownType,因为这会导致将该类型信息添加到WSDL中,而客户端又将其用于将消息反序列化为正确的类型。
对于初学者来说,这是一个用于测试您所描述的场景的有用工具:http://www.wcfstorm.com
答案 2 :(得分:0)
您可以尝试创建DataContractSurrogate(IDataContractSurrogate)并返回基本类型以调用GetDataContractType。我不太确定它是如何被使用的,所以你仍然可以更好地使用“额外的工作”,但也许我不理解这项额外工作的范围。
答案 3 :(得分:0)