使用XML进行WCF请求validation

我有一个使用.Net 4.0框架的WCF SOAP Web服务。 我使用contract first方法 – 即,使用WCSF Blue工具从手写WSDL生成服务代码。

我对请求消息有以下要求。

如果价格低于100,则不得有税元素,但如果它超过100,则需要纳税元素。

在XPath中,表达式如下

 //t:price[. =100][following::t:tax] 

我可以在服务的C#代码中处理它。 但我想使用任何XML技术在WSDL本身中定义规则。 这将有助于客户端了解输入消息应满足的业务validation。 (这是业务规则的定义,其实现在WSDL本身;不会将其他文档共享给客户端。)

在WCF中实现它的最佳方法是什么? 在WSDL哪个部分我可以定义XML validations以便它由WCF处理?

在下面给出的前两个引用中,提到了一种关于XPath和C#处理程序(用于Web服务框架)的方法。 我们不能在WCF中这样做吗? C#不能从WSDL读取XPath吗? 怎么做? 任何参考?

注意 :我可以执行C#处理程序; 但validationbusiness logic应该是XML

参考

  1. 使用业务规则validation扩展ASP.NET WebMethod框架 – 由Aaron Skonnard和Dan Sullivan完成
  2. WS-Policy和WSE 2.0断言处理程序 – 由Aaron Skonnard撰写
  3. Hartmut的盒子 – 使用WCF的四个原则和XML消息传递
  4. 在WCF中使用Schema进行消息validation
  5. 使用Schematron / XSD在C#中进行XMLvalidation
  6. 在xsd中定义xml,其中属性确定可能的内容

我不认为您可以在WSDL本身中执行此操作,但您可以插入在调度用户代码之前执行validation的处理程序。

有一个企业库块可以处理这种validation,当然你可以自己动手并将其添加到WCF堆栈。

从为您的服务人员的规则的纯文本描述开始。 为每个规则指定一个标记,以便轻松引用它。

在C#中编写validation规则,并在消息validation处理程序中调用它们。 您仍然可以使用XQuery / XPath语法和配置文件来实现规则,但它将是一个实现细节。 如果某些规则在此级别定义很麻烦,您可以在代码中添加这些规则。 如果业务引入规则引擎,您可以使用引擎。 但这发生在服务接口的背后。 如果规则发生变化,则WSDL保持不变。

validation是否给出了失败规则的标记以及描述失败的清晰消息。 让人们整合您的服务访问开发环境,他们可以在那里玩弄合同。


关于如何使用XQuery样式validation:

Schematron允许您使用XML定义规则。 模式由阶段,模式,规则和断言组成,但基本上你的一个断言看起来像:

  If the price is less than 100, there must not be a tax element  

Schematron提供了一组XSLT转换,它们首先将您的schematron架构与业务规则转换为另一个XSLT转换。 生成的XSLT转换然后将XML输入转换为描述其有效性的一组validation消息。


但重点是有很多方法可以做到这一点,你可以用脚本语言配置断言并使用脚本来validation反序列化的参数。

 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和服务的行为。