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.

¿Fue útil?

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));
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top