2009-05-04 51 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來處理每個可能的錯誤,並區分它們之間的列表中的每個錯誤。您還希望確保在回程中妥善處理重複的條目。