Проверить SOAP по схеме XSD? - PullRequest
       21

Проверить SOAP по схеме XSD?

1 голос
/ 08 декабря 2010

У меня есть веб-служба SOAP, основанная на схеме XSD (схема сгенерировала классы, которые использовались в качестве входного параметра для метода веб-службы), например:

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 ]

0 голосов
/ 22 мая 2011

У меня возникла та же проблема, и ответ таков: это возможно сделать без необходимости вручную проверять все поля (что подвержено ошибкам, плюс, поскольку у вас уже есть схема, вы также можете ее использовать) .

Смотрите эту статью по теме.

По сути, следующий процесс заключается в том, чтобы сначала прочитать исходный 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));
}
0 голосов
/ 09 декабря 2010

Вместо этого я проверил вручную по полям:)

0 голосов
/ 09 декабря 2010

Я использовал XML bean (фреймворк XML) в моем предыдущем проекте. Мы создали схему xml, а затем сгенерировали объект bean-компонентов из схемы. Эти объекты XML-компонентов имеют множество удобных методов для проверки правильности XML и значений, передаваемых как часть XML.

Пожалуйста, дайте мне знать, если у вас есть какой-либо конкретный вопрос о бобах XML.

0 голосов
/ 08 декабря 2010

Это нелегко сделать и, возможно, не стоит.

Учтите, что если XML, отправляемый вашей службе, не соответствует схеме, он не будет десериализован должным образом. Если он достаточно плох, ваша сервисная операция даже не будет вызвана.

Тем не менее, если вам действительно нужно это сделать, то вам следует рассмотреть пример класса SoapExtension . Я рекомендую сначала получить пример, работающий в точности как есть. Затем я рекомендую вам создать новую версию примера и заставить ее делать то, что вы хотите.

Вам нужно изменить методы WriteInput и / или WriteOutput для проверки вашего XML с помощью одного из доступных методов, возможно, путем настройки XmlReader для выполнения проверки и чтения из входного потока; и конфигурирование XmlWrite для записи в выходной поток; а затем запустить цикл для чтения с входа и записи на выход.

...