我有一个基于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 )?
感谢。
答案 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));
}