Веб-сервис удаляет тег из моего XML-документа

#asp.net #xml #asmx #.net-1.1

#asp.net #xml #asmx #.net-1.1

Вопрос:

Я использую веб-сервис для преобразования XML-документа в PDF.

XML-документ, который я отправляю веб-службе, выглядит следующим образом.

 <?xml version="1.0" encoding="utf-16" ?> 
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
...
</fo:root>
  

У меня возникла проблема, поэтому я зашел в debug mod, чтобы выяснить, что когда объект XmlDocument передается с моего веб-сайта asp на веб-сервис, который работает на .NET 1.1, видит его
xml-тег. Есть ли причина, по которой этот тег удален? Может ли это быть вызвано ответом SOAP?

Есть ли способ обойти это, кроме как вручную добавить тег обратно в документ?

Редактировать

Отвечая на вопрос Джона, да, я имею в виду инструкцию по обработке. Он просто отключается, и мне было интересно, почему, потому что библиотека, которую я использую для преобразования, не работает без него. Если я добавлю его вручную, он будет работать нормально, но я просто хотел знать, почему он исчезает.

Редактировать 2

Даже если это не тег, библиотека, которой требуется XmlDocument, просто не работает без него, вот почему мне это нужно. Кроме этого, остальная часть документа обрабатывается правильно. Сгенерированная ссылка.cs из веб-ссылки выглядела следующим образом для вызываемого метода :

 /// <remarks/>
    [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/GeneratePdfFromXml", RequestNamespace="http://tempuri.org", ResponseNamespace="http://tempuri.org", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
    [return: System.Xml.Serialization.XmlElementAttribute(DataType="base64Binary")]
    public byte[] GeneratePdfFromXml(XmlNode FormattedObjectXml) {
        object[] results = this.Invoke("GeneratePdfFromXml", new object[] {
                    FormattedObjectXml});
        return ((byte[])(results[0]));
    }
  

Это та же проблема, что и другая проблема, с которой я столкнулся, когда на XmlDocument ссылаются как на XmlNode, поскольку ответ SOAP является самим XmlDocument .

Я просто изменил это на строку; MyXmlDocument.OuterXml; Таким образом, все сохраняется и проблем нет.

Комментарии:

1. На какой тег «XML» вы ссылаетесь? <?xml> ? Это инструкция по обработке, а не тег. Это не должно вызывать никаких проблем. Что заставляет вас думать, что это была проблема?

2. опять же, это не тег, это инструкция по обработке. Пожалуйста, покажите подпись (заголовок функции) вашей сервисной операции, которая удаляет инструкцию по обработке. Скорее всего, его следует удалить, но давайте посмотрим.

3. @Джон Сондерс — <?xml …?> не является PI, хотя и выглядит как таковой. Смотрите [ developerfusion.com/samplechapter/1704/beginning-xml/10 /] в разделе «Является ли объявление XML инструкцией по обработке?» Спецификация XML четко показывает разницу между объявлением XML [ w3.org/TR/2008/REC-xml-20081126/#NT-XMLDecl ] и инструкцию по обработке [ w3.org/TR/2008/REC-xml-20081126/#sec-pi]

4. @lavinio: спасибо за различие. Дело в том, что это не тег.

Ответ №1:

Скорее всего, это проблема с кодировкой. В объявлении XML утверждается, что документ находится в формате UTF-16, что составляет два байта на символ. Другая библиотека, вероятно, предполагает, в ее отсутствие, какую-то другую кодировку.

Комментарии:

1. Я думаю, именно поэтому библиотека выходит из строя, когда инструкция отсутствует.

Ответ №2:

Вы никогда не получите XML-объявление или инструкцию по обработке, переданную через XmlNode , XmlElement или XmlDocument параметр службе ASMX. Причина очевидна, если вы подумаете об этом. Запрос SOAP будет выглядеть примерно так:

 <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" >
    <SOAP-ENV:Body>
        <parameter>
            <?xml version="1.0" encoding="utf-16" ?> 
            <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
            </fo:root>
        </parameter>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
  

Но XML-объявление может отображаться только в самом начале документа, поэтому это недопустимо.

Решение, как вы нашли, заключается в отправке этого XML в виде строки. Введите свой тип параметра string и либо используйте XmlNode.OuterXml .