XSDスキーマに対してSOAPを検証しますか?
-
10-10-2019 - |
質問
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;
}
}
どのようにして検証できますか。スキーマに対して渡されました(この場合、スキーマクラスは 貿易機関)?
ありがとう。
解決 2
代わりにフィールドに対して手動で検証します:)
他のヒント
これを行うのは簡単ではなく、価値がないかもしれません。
サービスに送信されるXMLがスキーマと一致しない場合、適切に脱色しないことを考慮してください。それが十分に悪い場合、あなたのサービス操作は呼び出されません。
そうは言っても、本当にこれを行う必要がある場合は、 ソープテンション クラス。まず、まさに正確に機能する例を取得することをお勧めします。次に、例の新しいバージョンを作成し、必要なことをさせることをお勧めします。
あなたが望むのは、おそらく検証を行い、入力ストリームから読み取るようにXMLReaderを構成することにより、利用可能な方法のいずれかを使用してXMLを検証するためにWriteInputおよび/またはWriteOutputメソッドを変更することです。出力ストリームに書き込むようにXMLWriteを構成します。そして、入力から読み取り、出力に書き込みするためにループを実行します。
利用した XML Beans (XMLバインディングフレームワーク)以前のプロジェクト。 XMLスキーマを作成し、スキーマからXML Beansオブジェクトを生成しました。これらのXML Beansオブジェクトには、XMLの有効性とXMLの一部として渡された値を確認するための多くの便利な方法があります。
XML Beansに特別な質問がある場合は、お知らせください。
私は自分で同じ問題を抱えていましたが、答えは、すべてのフィールドを手動で検証する必要なくこれを行うことができるということです(これはエラーが発生しやすく、さらにスキーマがあるため、それを利用することもできます)。
基本的に、従うべきプロセスは、最初にオリジナルを読むことです request.inputStream xmldocumentに、その中の石鹸ボディにスキーマと検証を適用します。
[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));
}