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 validationsWCF

以下に示す最初の 2 つのリファレンスには、XPathC# ハンドラー (Web サービス フレームワーク用) について言及されているアプローチがあります。WCF でそれを行うことはできませんか? C# は WSDL から XPath を読み取ることができませんか? どうやってするの?参照はありますか?

: C# ハンドラーを実行しても問題ありません。しかし、business logicforは入っているvalidationべきですXML

参照

  1. ビジネス ルール検証による ASP.NET WebMethod フレームワークの拡張 - Aaron Skonnard および Dan Sullivan 著
  2. WS-Policy および WSE 2.0 アサーション ハンドラ – Aaron Skonnard 著
  3. Hartmut's Box - 4 つの原則と WCF による XML メッセージング
  4. WCF のスキーマを使用したメッセージの検証
  5. C# での Schematron/XSD による XML 検証
  6. 属性が可能なコンテンツを決定する xsd で xml を定義する
4

2 に答える 2

1

これをWSDL自体で実行できるとは思いませんが、ユーザーコードがディスパッチされる前に検証を実行するハンドラーを挿入することはできます。

この種の検証を処理できるEnterpriseLibraryブロックがあります。もちろん、独自の検証をロールしてWCFスタックに追加することもできます。

于 2013-03-20T09:44:15.387 に答える
1

サービスを呼び出している人にルールを平文で説明することから始めます。簡単に参照できるように、各ルールにタグを付けます。

検証ルールを C# で記述し、メッセージ検証ハンドラーで呼び出します。XQuery / XPath 構文と構成ファイルを使用してルールを実装することはできますが、それは実装の詳細になります。このレベルで定義するのが面倒なルールがある場合は、それらをコードに追加できます。ビジネスでルール エンジンが導入されている場合は、そのエンジンを利用できます。しかし、これはサービスのインターフェースの背後で発生します。ルールが変更されても、WSDL は同じままです。

検証で、失敗したルールのタグと、失敗を説明する明確なメッセージを提供します。サービスと統合する人々に、コントラクトをいじることができる開発環境へのアクセスを提供します。


XQuery スタイルの検証の使用方法について:

Schematronでは、XML でルールを定義できます。スキーマはフェーズ、パターン、ルール、およびアサーションで構成されますが、基本的にアサーションの 1 つは次のようになります。

<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 変換に変換する一連の 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 に答える