9

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

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

如果价格小于 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

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

注意:我可以让 C# 处理程序执行;但business logicforvalidation应该在XML

参考

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

2 回答 2

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 也不会改变服务的行为。

于 2013-03-25T08:48:32.400 回答
1

我认为您不能在 WSDL 本身中执行此操作,但您可以插入一个处理程序,在分派用户代码之前执行验证。

有一个 Enterprise Library 块可以处理这种验证,或者您当然可以自己动手并将其添加到 WCF 堆栈中。

于 2013-03-20T09:44:15.387 回答