2009-10-29 100 views
2

問候!服務器端和客戶端WCF共享驗證庫可以嗎?

我在IIS服務器(因此是客戶端)引用的應用程序服務器上使用WCF庫。我想把我的驗證放在一個地方,這樣我就可以調用.Validate(),它返回一串錯誤(字段太短,缺失等)。問題是,這些函數不會跨越WCF邊界,我真的不想在WCF服務和IIS/WCF客戶端中編寫相同的邏輯。有沒有辦法使用擴展方法或類似的東西,所以雙方都可以使用調用相同代碼的.Validat()方法?

非常感謝您的任何想法! Steve

回答

5

如果控制線兩側,即服務器端(服務)和客戶端,那麼你可以做到以下幾點:

  • 把所有的服務和數據合同到共享裝配
  • 參考從服務器端和客戶端
  • 手動創建客戶端代理(由ClientBase<T>獲得或從ChannelFactory<T>創造它)這兩個「合同」集結號 - 不使用「添加服務引用」或SvcUtil工具。可執行程序!
  • 把所有的驗證邏輯到一個共享組件
  • 參考來自兩個項目共享的驗證組件

如果你想使用一個共享的驗證組件,你必須確保你的服務器上使用的數據類型和客戶端是相同的 - 這隻有在您還共享服務和數據合同時才能完成。不幸的是,這需要手動創建客戶端代理(這真的不是什麼大問題!)。

如果您使用「添加服務引用」,Visual Studio將根據其元數據檢查服務,並創建一組新的客戶端對象,其中看起來在其字段和所有,但是它們是一個單獨的,不同的類型,因此您將無法在服務器端和客戶端對象上使用共享驗證。

1

將數據發送到服務器進行驗證是否存在問題?換句話說,你的服務接口實際上提供了「Validate」方法,並且接受一個充滿數據的數據契約,驗證它並返回一個List,其中T是某種定製的ValidationResult數據契約,它包含你需要的關於驗證警告/錯誤。

在服務架構中,您不能相信客戶端,理論上他們可能是其他公司的客戶端爲您完成了適當的數據驗證。您始終需要在服務層進行設計,並將這些驗證問題傳達給您的客戶。所以,如果你在服務器上完成這項工作,爲什麼不把這個邏輯開放給客戶端,這樣他們就可以直接使用它?當然客戶可以(應該)仍然進行一些基本的輸入驗證,例如檢查空值,空字符串,值超出範圍等,但是核心業務邏輯檢查應該發送到服務。

+0

嗨德魯,謝謝你的迴應。我曾考慮類似的東西 - 我也讚賞驗證服務器端的價值。然而,這背後的一點是想出一個更有創意的方式來限制通過WCF的數據量 - 因此,首先提供驗證客戶端,而不是讓它們提交它只是失敗。如果我公開了驗證函數,那麼每種類型的對象都需要一個,它仍然需要通過電線 - 所以理想情況下,我希望有一些方法可以共享驗證代碼,以便兩者都可以使用它。 – MrCraze 2009-10-29 01:14:32

+0

那麼沒有辦法共享行爲,除非你創建一個包含你的數據協議的程序集以及這些幫助器方法,並將其提供給你的客戶。從純粹的SOA角度來看,這不是「純粹」的方式(如果它是另一方面的Java/PHP/Ruby,不會有所幫助,但是如果這是一個內部服務,並且您可以控制該組件客戶使用與您的服務進行通信,那麼您可以保證他們也會使用最新和最好的驗證邏輯。 – 2009-10-29 01:44:07