0

次の署名を持つ小さな WCF サービスがあります。

string ProcessMessage(XmlElement xmlSource);

xml 宣言なしでリクエストを受け取ると、Web サービスは正常に動作しますが、xml 宣言が追加されるとすぐにクラッシュします。

機能するリクエスト

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">
    <soapenv:Header/>
    <soapenv:Body>
        <tem:ProcessMessage>
            <tem:xmlSource>            
                <clipped>elements here</clipped>
            </tem:xmlSource>
        </tem:ProcessMessage>
    </soapenv:Body>
</soapenv:Envelope>

うまくいかないリクエスト

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">
    <soapenv:Header/>
    <soapenv:Body>
        <tem:ProcessMessage>
            <tem:xmlSource>
            <?xml version="1.0" encoding="UTF-8"?>                
                <clipped>elements here</clipped>
            </tem:xmlSource>
        </tem:ProcessMessage>
    </soapenv:Body>
</soapenv:Envelope>

そしてクラッシュ:

<Message>No characters can appear before the XML declaration. Line 7, position 14.</Message>
                     <StackTrace>at System.Xml.XmlExceptionHelper.ThrowXmlException(XmlDictionaryReader reader, String res, String arg1, String arg2, String arg3)
   at System.Xml.XmlUTF8TextReader.ReadDeclaration()
   at System.Xml.XmlUTF8TextReader.Read()
   at System.Xml.XmlBaseReader.MoveToContent()
   at System.Xml.Serialization.XmlSerializationReader.ReadXmlNode(Boolean wrapped)
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderINBUWProcessingService.Read1_ProcessMessage()
   at Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer.Deserialize(XmlSerializationReader reader)
   at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)</StackTrace>
                     <Type>System.Xml.XmlException</Type>
                  </InnerException>
                  <Message>There is an error in XML document (7, 14).</Message>
                  <StackTrace>at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
   at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle)
   at System.ServiceModel.Dispatcher.XmlSerializerOperationFormatter.DeserializeBody(XmlDictionaryReader reader, MessageVersion version, XmlSerializer serializer, MessagePartDescription returnPart, MessagePartDescriptionCollection bodyParts, Object[] parameters, Boolean isRequest)</StackTrace>
                  <Type>System.InvalidOperationException</Type>

私が想定しているのは、WCF サービスが SOAP エンベロープ全体を 1 つの xml ドキュメントとして読み取ってから、(パラメーターのxmlSource) xml 宣言に遭遇すると、それを SOAP エンベロープ全体の xml ドキュメントとして解釈することです。ここでクラッシュし、xml 宣言がドキュメントの最初の部分である必要があると表示されます。

これを修正する方法や、Web サービスに到達する前にリクエストから xml 宣言を削除する方法はありますか?

4

1 に答える 1

1

サービスに送信している XML が無効です。XML 仕様によると、XML 宣言はドキュメントのプロローグにのみ表示できます。整形式の XML ドキュメントは、プロローグ+ルート要素で構成されます。また、要素ノードでは XML 宣言は許可されません。

XML 宣言を含むドキュメントを文字列として渡すことを検討することをお勧めします (たとえば、<!\[CDATA\[section内で、または XML 文字をエスケープする)。これにより、XML 要求内で XML「ドキュメント」を受け取ることができます。

于 2013-08-19T22:54:17.860 に答える