2009-05-04 65 views
2

我正在使用Windows Communication Foundation(WCF)创建一个webservice,而我目前不知道用它进行验证的最佳方法是什么。列表<Customer>全部或全部

我有两种方法:CreateCustomer(Customer)CreateCustomers(List<Customer>)

如果客户通过客户列表,而某些客户无效,我应拒绝整个请求吗?或者,我应该返回通过验证的那些,并标出那些无效的标签?

或者,我应该只允许他们调用CreateCustomer(Customer)方法,让他们反复调用它,如果他们希望创建一个客户吗?

回答

2

在这种情况下,我会推荐一种类似于交易的方法。

基本上,你会验证一切,如果他们没有通过,抛出异常,或其他验证失败的事件,与客户(S)未通过使用标识符或实际的对象。这将允许管道另一端的人员识别问题。

为了保存到数据库中,我会考虑在一个事务中这样做,以及,部分节省1-7客户,但不是8可能会导致问题。

+0

你好汤姆。 感谢您的咨询。 我想让我感到困惑的是如何通知客户端哪个记录导致了错误,但是您的权利,我可以通过提供主标识符让他们知道。 一个快速跟进问题。假设,如果有8个客户通过,第一个通过验证失败。当时你会回到客户那里吗?还是你会继续验证其他记录,从而产生任何错误?谢谢,史蒂文 – stevenrosscampbell 2009-05-04 15:32:39

+0

个人而言,我会继续并验证它们,然后发回所有验证错误。这将为您节省一些来回的流量,特别是在容易出错的更新中。很高兴我能帮上忙。 – 2009-05-05 04:03:29

0

,如果你做尽可能多的工作在每次调用可行,所以接受列表,并只对有问题的情况下返回错误(在处理等),您将减少回往复的交通似乎不错。当然,例外的工作将是需要原子化(全部或全部)的工作,但就应用程序语义而言,似乎并非如此。

1

由于您正在开发Web服务,您可能希望减少往返次数。这就是说,摆脱CreateCustomers(列表)是一个坏主意。

现在是艰难的部分。我建议你把它留给客户,他们想如何处理错误。您可以将CreateCustomers方法的签名更改为包含一个bool,以确定他们是全部还是全部。像这样:CreateCustomers(list,allOrNothing)。此操作的返回类型应该是包含客户属性的对象列表,以及关于是否成功的布尔值。

+0

谢谢杰里米。 我将研究allOrNothing标志方法。 一切顺利。 Steven。 – stevenrosscampbell 2009-05-04 15:45:00

0

供应商向您提供符合您Web服务合同的数据由供应商决定。如果不是这样,那么他们会帮他们告诉他们哪些数据不好(至少与我最近开发的所有API相比)。

接受是有效的客户和未能够更加混淆事项,在这种情况下,那些:

我做一个列表custs ...;大小为100,并调用您的CreateCustomers(custs)。 20是不好的,但你提供了为什么的信息。很多我的数据输入文员打字错误。问题解决了,我重试了CreateCustomers(custs),但是我得到一个错误,其中有80个已经存在。你是否仍然创建了20个固定的(因为你最后一次传递了数据)?

使所有事务处于原子状态的一个主要好处是,如果某些事情不起作用,那么您肯定知道在失败的操作后状态没有改变。

0

在你描述的情况下,它取决于你想如何管理你的WCF中的错误(faultcontract)。

Allornothing方法将要求您创建一个错误合同,可以简单地声明一个或多个客户请求中存在错误。

如果你不采用这种方法,那么你可能会想要设计你的datacontract/faultcontract来处理每个可能的错误,并区分它们之间的列表中的每个错误。您还希望确保在回程中妥善处理重复的条目。