Validar jabón contra el esquema XSD?
-
10-10-2019 - |
Pregunta
Tengo un servicio web SOAP que se basa en un esquema XSD (el esquema generado las clases que se utilizó como el parámetro de entrada para el método de servicio web), como tal:
public class CMService : WebService
{
[WebMethod(Description = "Submit trades")]
public bool SubmitTrades(List<TradesTrade> trades)
{
// Validation, if true, return true, else, return false;
return true;
}
}
¿Cómo puedo validar fue aprobada en contra del esquema (En este caso, la clase de esquema es TradesTrades )?
Gracias.
Solución 2
He manualmente validar contra los campos en su lugar:)
Otros consejos
No es fácil de hacer esto, y puede que no valga la pena.
Tenga en cuenta que si el código XML que se envía a su servicio no coincide con el esquema, entonces no va a deserializar correctamente. Si es bastante malo, ni siquiera se llama su operación de servicio.
Dicho esto, si usted realmente necesita para hacer esto, entonces usted debe buscar en el ejemplo de un clase SoapExtension . Le recomiendo que primero consigue el ejemplo de trabajo tal y como está. A continuación, le recomiendo que crea una nueva versión del ejemplo, y hacer que haga lo que quiera.
Lo que queremos es modificar la WriteInput y / o métodos WriteOutput para validar el código XML usando uno de los métodos disponibles, tal vez mediante la configuración de un XmlReader para hacer la validación y para leer desde el flujo de entrada; y configuración de un XmlWrite escribir en el flujo de salida; y luego ejecutar un bucle para leer de la entrada y de escritura a la salida.
granos XML (marco vinculante xml) en mi proyecto anterior. Hemos creado el esquema XML y luego generamos el objeto habas XML del esquema de. Estos granos XML a objetos tienen una gran cantidad de métodos convenientes para comprobar la validez del xml y los valores pasadas como parte del XML.
Por favor, hágamelo saber, Si usted tiene alguna pregunta en particular en los granos de XML.
estado teniendo el mismo problema por mí mismo, la respuesta es que su posible hacer esto sin necesidad de validar manualmente todos los campos (que es propenso a errores, ventaja, ya que tiene el esquema ya que puede también hacer uso de ella) .
ver este un artículo sobre el tema .
Básicamente, el proceso a seguir es leer primero el original Request.InputStream en un XmlDocument y luego aplicar el esquema y validación al cuerpo SOAP en su interior.
[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));
}