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

做到这一点并不容易,而且可能不值得。

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

也就是说,如果您真的需要这样做,那么您应该查看SoapExtension类的示例。我建议您首先让示例按原样工作。然后,我建议你创建一个新版本的示例,并让它做你想做的事。

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

于 2010-12-08T20:24:30.210 回答
0

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

于 2010-12-09T20:31:25.130 回答
0

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

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

于 2010-12-09T20:46:03.407 回答
0

我自己也遇到过同样的问题,答案是它可以在不需要手动验证所有字段的情况下做到这一点(这很容易出错,而且既然你已经有了架构,你也可以使用它)。

请参阅有关该主题的文章。

Basically, the process to follow is to first read the original Request.InputStream into an XmlDocument and then apply your schema and validation to the SOAP body inside it.

[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 回答