我正在使用第三方API,我通过网络服务公开其对象。不幸的是,API有一些怪癖,包括在对象的ID字段为0时尝试访问某些属性时抛出异常。
所以我在服务器上创建一个有效的对象实例,并通过WCF服务将其推送到客户端。客户端收到对象时会发生此问题。似乎无论出于何种原因,服务都会在之前检查对象的每个属性,它会在客户端上填充它们。因此,当客户端接收到异常时,对象会抛出异常,但在我能够对它们做任何事情之前。这是一些快速示例代码,用于演示正在发生的事情。
public class ExposedClass {
public int Id { get; set; }
List<OtherClass> _other;
public List<OtherClass> Other {
get {
if (Id == 0) throw new Exception("Can't access field 'other' if object not initialized");
return _other;
}
}
}
在服务中:
[ServiceContract]
public MyService {
[OperationContract]
public ExposedClass GetThing() {
ExposedClass c = new ExposedClass();
c.Initialize(); // makes the Id field valid
return c;
}
}
客户:
[TestMethod]
public void GetThingFromService {
var svcClient = new MyClient();
var c = svc.GetThing(); // exception thrown here on client
Assert.IsNotNull(c);
}
有什么想法吗?
答案 0 :(得分:4)
通常,DataContract类不应包含任何编程逻辑。它被用作一种容器来存储传递给客户端的信息。
我的方法是将第三方对象所需的信息复制到自定义DTO(数据传输对象)上,然后再将其发送到网络中。
客户端实际需要第三方课程吗?如果可能的话,丢弃服务器上的第三方对象是个好主意,从而将用户与您无法控制的错误代码分层并隔离。
答案 1 :(得分:1)
有两种可能性:
对象永远不应该依赖于为此确切原因分配的字段的顺序。