我觉得abit不好意思询问这件事。似乎无法在其他任何地方找到它描述......
比如说,我们有一个Web服务方法StoreNewItem(Item item),它接收带有该项的所有属性的datacontract。 我们将在数据库中插入这个新项目。 一些属性是必需的,其中一些是布尔值。
我们是否应该验证收到的数据,即验证必填字段实际上是否有有效数据,或者这应该是调用Web服务的客户端的责任?
如果是,如何处理布尔属性?客户端可能会忽略它们,并且它们将在db中存储为false,因为我们无法知道它们是设置为false还是仅被客户端忽略/遗忘。
使用带有True,False和Empty的枚举而不是bool作为这些强制属性的类型是否有效? 或者这不是我们的问题吗?
欢迎所有的想法!
答案 0 :(得分:0)
绝对验证数据。恶意实体可以轻松复制您的客户。
答案 1 :(得分:0)
您可以使用可由网络服务完全支持的可空布尔值(bool?)而不是枚举。
恕我直言你的检查逻辑至少应该在db中,它可以将错误转发给服务层(反过来应该引发故障)。我也在服务级别拥有它,以便在命中db之前可以引发错误(验证也是业务层的一部分)。在UI中使用它也很好但不是强制性的。
永远不要假设您的客户向您发送有效数据。
答案 2 :(得分:0)
取决于您的业务规则。
你可以使用可选参数,如果你想允许使用不传递一些参数,但你希望它们有一个默认值
void MyServiceMethod(bool CanDoIt=false,int somethingElse)
或者,如果您希望允许用户不使用空值传递所有参数(如果您的业务规则可以允许),则可以使您的服务获得可为空的值
void MyServiceMethod(Nullable<bool> canDoItfalse,int somethingElse)
通常,您应始终验证服务端的数据,并在验证失败的情况下返回服务故障数据合同
的更多信息
答案 3 :(得分:0)
如果没有外部第三方访问Web服务(仅在内部使用),您可以在服务中不进行验证。就个人而言,我不会这样做;将错误数据发送到服务太容易了。另外,您必须复制所有客户端的所有验证逻辑。因此,我认为必须在服务中进行验证。
就布尔值而言,你可以使用可空的布尔值(bool?
)。