我正在使用Windows Communication Foundation(WCF)创建一个Web服务,我目前不知道用它进行验证的最佳方法是什么。
我有两种方法:CreateCustomer(Customer)
和CreateCustomers(List<Customer>)
。
如果客户传入客户列表,而某些客户无效,我应该拒绝整个请求吗?或者我应该返回那些通过验证并标记无效的那些?
或者,我是否应该只允许他们调用CreateCustomer(Customer)
方法并让他们在想要创建多个客户时重复调用它?
答案 0 :(得分:2)
在这种情况下,我建议采用类似交易的方法。
基本上,您将验证所有,如果它们没有通过,则使用未使用标识符或实际对象传递的客户抛出异常或其他验证失败事件。这将允许管道另一侧的人识别问题。
为了保存到数据库,我会考虑在事务中执行此操作,部分保存1-7个客户,但不是第8个可能会导致问题。
答案 1 :(得分:1)
由于您正在开发Web服务,因此您可能希望减少往返次数。据说摆脱CreateCustomers(列表)是一个坏主意。
现在是艰难的一部分。我建议你把他们想要处理的错误交给客户。您可以更改CreateCustomers方法的签名,以包括bool是否要全部或全部。像这样:CreateCustomers(list,allOrNothing)。此操作的返回类型应该是具有客户属性的对象列表,以及关于它是否成功的bool。
答案 2 :(得分:0)
如果您在每次调用时尽可能多地工作,您将减少来回流量,因此接受列表并仅针对有问题的情况(在处理其他情况时)返回错误似乎很好。当然例外是需要原子(全部或全部)的工作,但是在应用程序语义方面似乎不是这种情况。
答案 3 :(得分:0)
由提供商提供符合您的Web服务合同的数据。如果没有,那么你可以帮他们告诉他们哪些数据不好(至少与我最近开发的所有API相比)。
在这种情况下,接受有效的客户和非有效的客户甚至会更加困惑:
我制作了一份清单......大小为100并调用CreateCustomers(custs)。 20是坏的,但你提供了有关原因的信息。结果我的数据输入职员打字错误很多。问题解决了,我重试CreateCustomers(custs),但是我收到一个错误,其中80个已经存在。你是否仍然创建了20个被修复的(因为,你上次我通过数据时这样做了吗?)
让所有事务处于原子状态的一个主要好处是,如果某些事情不起作用,那么您肯定知道在操作失败后状态没有改变。
答案 4 :(得分:0)
在您描述的场景中,它归结为您希望如何管理WCF中的错误(faultcontract)。
Allornothing方法将要求您创建一个可以简单说明一个或多个客户请求中存在错误的faultcontract。
如果您不采用这种方法,那么您可能希望设计datacontract / faultcontract以处理每个可能的错误,并为列表中的每个错误区分它们。您还希望在回程中优雅地处理重复的条目。