1

XSD スキーマに基づく SOAP Web サービスがあります (スキーマは、Web サービス メソッドの入力パラメーターとして使用されるクラスを生成しました)。

public class CMService : WebService
{
    [WebMethod(Description = "Submit trades")]
    public bool SubmitTrades(List<TradesTrade> trades)
    {
        // Validation, if true, return true, else, return false;
        return true;
    }
}

スキーマに対して渡されたものを検証するにはどうすればよいですか (この場合、スキーマ クラスはTradesTradesです)。

ありがとう。

4

4 に答える 4

0

代わりにフィールドに対して手動で検証しました:)

于 2010-12-09T20:31:25.130 に答える
0

これを行うのは簡単ではなく、価値がないかもしれません。

サービスに送信される XML がスキーマと一致しない場合、適切に逆シリアル化されないことを考慮してください。それが十分に悪い場合、サービス操作は呼び出されません。

そうは言っても、本当にこれを行う必要がある場合は、SoapExtensionクラスの例を参照する必要があります。最初に、例をそのまま正確に動作させることをお勧めします。次に、例の新しいバージョンを作成し、希望どおりに動作させることをお勧めします。

必要なのは、WriteInput および/または WriteOutput メソッドを変更して、使用可能なメソッドのいずれかを使用して XML を検証することです。おそらく、検証を実行して入力ストリームから読み取るように XmlReader を構成することによります。出力ストリームに書き込むように XmlWrite を構成します。次に、ループを実行して入力から読み取り、出力に書き込みます。

于 2010-12-08T20:24:30.210 に答える
0

以前のプロジェクトでXML Bean (xml バインディング フレームワーク) を使用しました。xml スキーマを作成し、スキーマから xml Bean オブジェクトを生成しました。これらの XML Bean オブジェクトには、XML の有効性と XML の一部として渡された値をチェックするための便利なメソッドが多数あります。

XML Bean に関する特定の質問がある場合は、お知らせください。

于 2010-12-09T20:46:03.407 に答える
0

私自身も同じ問題を抱えていましたが、答えは、すべてのフィールドを手動で検証する必要なくこれを行うことができるということです (これはエラーが発生しやすく、スキーマが既にあるため、それを利用することもできます)。

このトピックに関する記事を参照してください。

基本的に、従うべきプロセスは、最初に元のRequest.InputStreamを XmlDocument に読み取り、次にスキーマと検証をその中の SOAP 本文に適用することです。

[WebMethod(Description = "Echo Soap Request")]
public XmlDocument EchoSoapRequest(int input)
{
  // Initialize soap request XML
  XmlDocument xmlSoapRequest = new XmlDocument();
  XmlDocument xmlSoapRequestBody = new XmlDocument();

  // Get raw request body
  HttpContext httpContext = HttpContext.Current;
  Stream receiveStream = httpContext.Request.InputStream

  // Move to begining of input stream and read
  receiveStream.Position = 0;
  using (StreamReader readStream = new StreamReader(receiveStream, Encoding.UTF8))
  {
    // Load into XML document
    xmlSoapRequest.Load(readStream);
  }

  // Now we have the original request, strip out the request body
  foreach (XmlNode node in xmlSoapRequest.DocumentElement.ChildNodes)
  {
     if (node.NodeType == XmlNodeType.Element && node.LocalName == "Body" && node.FirstChild != null)
     {
        xmlSoapRequestBody.LoadXml(node.FirstChild.InnerXml);
     }
  }

  // Validate vs Schema
  xmlSoapRequestBody.Schemas.Add("http://contoso.com", httpContext.Server.MapPath("MySchema.xsd"))
  xmlSoapRequestBody.Validate(new ValidationHandler(MyValidationMethod));
}
于 2011-05-21T23:32:14.797 に答える