针对XSD架构验证SOAP?

时间:2010-12-08 20:16:55

标签: .net soap xsd asmx xsd-validation

我有一个基于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 个答案:

答案 0 :(得分:0)

这样做并不容易,可能不值得。

请注意,如果发送到您的服务的XML与架构不匹配,那么它将不会正确反序列化。如果它足够糟糕,甚至不会调用您的服务操作。

那就是说,如果你真的需要这样做,那么你应该看看SoapExtension类的例子。我建议您首先让示例完全按原样运行。然后,我建议您创建该示例的新版本,并使其按照您的意愿进行。

您想要的是修改WriteInput和/或WriteOutput方法以使用其中一种可用方法验证XML,可能是通过配置XmlReader来进行验证并从输入流中读取;并配置XmlWrite以写入输出流;然后运行循环以从输入读取并写入输出。

答案 1 :(得分:0)

我已经手动验证了字段:)

答案 2 :(得分:0)

我在之前的项目中使用了XML beans(xml绑定框架)。我们创建了xml架构,然后从架构中生成了xml beans对象。这些XML bean对象有很多方便的方法来检查xml的有效性以及作为XML的一部分传入的值。

如果您对XML bean有任何特殊问题,请告诉我。

答案 3 :(得分:0)

我自己也遇到了同样的问题,答案是它可以在不需要手动验证所有字段的情况下执行此操作(这很容易出错,而且因为您已经拥有了模式,所以您也可以使用它)

See this a article on the topic.

基本上,要遵循的过程是首先将原始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));
}