Domanda

Ho un servizio SOAP web che si basa su uno schema XSD (lo schema generato le classi che è stato utilizzato come parametro di input per il metodo di servizio Web), come ad esempio:

public class CMService : WebService
{
    [WebMethod(Description = "Submit trades")]
    public bool SubmitTrades(List<TradesTrade> trades)
    {
        // Validation, if true, return true, else, return false;
        return true;
    }
}

Come posso validate è stata approvata nel rispetto allo schema (in questo caso, la classe di schema è TradesTrades )?

Grazie.

È stato utile?

Soluzione 2

Non ho manualmente convalidare contro i campi invece:)

Altri suggerimenti

Non è facile fare questo, e non può essere utile.

Si consideri che se l'XML viene inviato al tuo servizio non corrisponde allo schema, allora non deserializzare correttamente. Se è già abbastanza grave, non sarà nemmeno essere chiamato l'operazione di servizio.

Detto questo, se si ha realmente bisogno di fare questo, allora si dovrebbe guardare l'esempio di una SoapExtension classe. Vi consiglio in primo luogo ottenere l'esempio di lavoro esattamente così com'è. Poi, vi consiglio di creare una nuova versione dell'esempio, e fargli fare ciò che si desidera.

Ciò che si vuole è quello di modificare il WriteInput e / o metodi WriteOutput per convalidare l'XML utilizzando uno dei metodi disponibili, forse configurando un XmlReader per fare la convalida e di leggere dal flusso di input; e configurare un XMLWrite per scrivere nel flusso di uscita; e poi eseguire un ciclo per leggere l'input e scrittura per l'uscita.

fagioli XML (quadro vincolante xml) nel mio progetto precedente. Abbiamo creato lo schema XML e quindi generato l'oggetto fagioli XML dallo schema di. Questi fagioli XML opporsi avere un sacco di metodi utili per verificare la validità del XML ei valori passato come una parte del XML.

Per favore fatemi sapere, se avete qualche domanda particolare sui fagioli XML.

I state avendo lo stesso problema io stesso, la risposta è che la sua possibile fare questo senza bisogno di validare manualmente tutti i campi (che è soggetto ad errori, più dal momento che avete già lo schema che si può anche fare uso di esso) .

Vai a questa un articolo sul tema .

In sostanza, il processo da seguire è di avere letto l'originale Request.InputStream in un XmlDocument e quindi applicare lo schema e la validazione al corpo SOAP al suo interno.

[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));
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top