2013-03-16 59 views
9

我有一個使用.Net 4.0框架的WCF SOAP Web服務。我正在使用contract first方法 - 即使用WCSF藍色工具從手寫WSDL生成服務代碼。使用XML進行WCF請求驗證

我對請求消息有以下要求。

如果價格小於100,則不得有稅元,但是如果它大於100,則需要稅元。

在XPath表達式將如下

//t:price[. < 100][not(following::t:tax)] or 
//t:price[. >=100][following::t:tax] 

我可以在服務的C#代碼處理它。但是我想使用任何XML技術來定義它在WSDL中的規則。這將幫助客戶知道什麼是輸入消息應該符合的業務驗證。 (這是業務規則的定義,其實施在WSDL本身;而不是其他文檔將被分享給客戶端。)

在WCF中實現它的最佳方式是什麼?在WSDL的哪一部分下,我可以定義XML validations,以便它將由WCF處理?

在下面給出的前兩個參考文獻中,提到了關於XPath和C#處理程序(用於Web服務框架)的方法。我們不能在WCF中這樣做嗎?不能C#從WSDL讀取XPath?怎麼做?任何參考?

注意:我沒關係讓C#處理程序執行;但business logicvalidation應在XML

參考

  1. Extend the ASP.NET WebMethod Framework with Business Rules Validation -by Aaron Skonnard and Dan Sullivan
  2. WS-Policy and WSE 2.0 Assertion Handlers – by Aaron Skonnard
  3. Hartmut's Box - The Four Tenets and XML Messaging with WCF
  4. Message validation with Schema in WCF
  5. XML validation with Schematron/XSD in C#
  6. Defining xml in an xsd where an attribute determines the possible contents
+1

您的兩個引用對WCF沒有任何直接適用性。 WCF框架取代了這些鏈接中引用的WSE和XML Web服務框架。 WCF支持使用WS-Policy&WS-PolicyAssertions來定義soap XML的結構。如果我今天有時間,我會把一些東西放在一起做類似於你想要達到的目標。 – 2013-03-19 13:08:23

+1

我們成功地在schematron中編寫了* simple *驗證規則,並在處理程序中驗證了這些規則。但是,請參閱http://stackoverflow.com/questions/787554/xml-validation-with-schematron-xsd-in-c-sharp。您可能想重新考慮僅限xml的需求。 – flup 2013-03-21 21:38:22

+0

@SixtoSaez謝謝。期待您的回答。即使你不能提供完整的代碼,如果你能分享類/邏輯/參考文章,那將是非常好的。 – Lijo 2013-03-25 08:50:22

回答

1

我不認爲你可以在WSDL本身做到這一點,但您可以將您的用戶密碼被派遣之前執行驗證的處理程序。

有一個企業庫塊可以處理這種驗證,或者當然你可以推出自己的並將其添加到WCF堆棧。

+0

它應該是可能的WCF,因爲它可能在Web服務框架中@SixtoSaez評論 – Lijo 2013-03-25 14:48:25

1

從調用服務的人對規則的純文本描述開始。給每個規則一個標籤,以便它可以很容易地被引用。

用C#編寫驗證規則,並在消息驗證處理程序中調用它們。您仍然可以使用XQuery/XPath語法和配置文件來實現規則,但它將是一個實現細節。如果某些規則在這個級別定義起來很麻煩,可以將它們添加到代碼中。如果業務引入規則引擎,則可以使用引擎。但是這發生在服務界面的後面。如果規則改變,那麼WSDL保持不變。

驗證是否給出了失敗規則的標籤以及描述失敗的清晰消息。讓人們與您的服務相結合,訪問開發環境,在那裏他們可以玩弄合同。


關於如何使用XQuery風格的驗證:

Schematron允許你在XML定義規則。一個模式由階段,模式,規則和斷言,但基本上你的斷言一個看起來像:

<assert id="NO-TAX-LOW-PRICE" test="price >= 100 or not(following::t:tax)"> 
    If the price is less than 100, there must not be a tax element 
</assert> 

的Schematron提供了一組XSLT的轉換,首先與業務規則,將您的Schematron模式到另一個XSLT轉換。此生成的XSLT轉換然後將XML輸入轉換爲描述其有效性的一組驗證消息。


但整點是,有很多方法可以做到這一點,你可以在一個腳本語言配置斷言,並使用腳本來驗證反序列化的參數。

if(order.price < 100 && order.tax) { 
    fail("NO-TAX-LOW-PRICE", 
     "If the price is less than 100, there must not be a tax element"); 
} 

如果你發現另一個更適合你,你可以改變實現。它不會改變wsdl或服務的行爲。

+0

以下是我想避免的 - 「在C#中編寫驗證規則」# – Lijo 2013-03-25 14:37:11

+0

@Lijo它成爲一個實現細節。我會補充一點解釋。 – flup 2013-03-25 17:02:40

+0

我已經添加了一些額外的信息。 – flup 2013-03-25 21:15:49