是否可以阻止WCF服务检查客户端上的对象属性?

时间:2011-01-10 20:06:01

标签: c# wcf web-services

我正在使用第三方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);
}

有什么想法吗?

2 个答案:

答案 0 :(得分:4)

通常,DataContract类不应包含任何编程逻辑。它被用作一种容器来存储传递给客户端的信息。

我的方法是将第三方对象所需的信息复制到自定义DTO(数据传输对象)上,然后再将其发送到网络中。

客户端实际需要第三方课程吗?如果可能的话,丢弃服务器上的第三方对象是个好主意,从而将用户与您无法控制的错误代码分层并隔离。

答案 1 :(得分:1)

有两种可能性:

  1. 联系图书馆的开发人员并告诉他们需要修复他们的代码。
  2. 禁止使用(如果许可允许)反射器并拆开组件,自行修复并重新编译。
  3. 对象永远不应该依赖于为此确切原因分配的字段的顺序。