SOAP Удаление сообщения XML Версия - PullRequest
0 голосов
/ 19 июня 2020

Я работаю над SOAP Сервисом, где мне нужно отправить форматированное сообщение об ошибке с <?xml version="1.0" encoding="UTF-8"?> в верхней части исходящего сообщения.

Успешные ответы не содержат текст этой версии вверху ответа.

Причина, по которой я это делаю, состоит в том, что мы берем на себя обеспечение системы и исходного поставщика и получили только файл WSDL.

У меня есть метод который пытается изменить сообщение, чтобы включить это, как показано ниже, однако, когда я помещаю это в новое сообщение, <?xml version="1.0" encoding="UTF-8"?> удаляется.

    public Message ChangeString(Message oldMessage, string from, string to)
    {
        MemoryStream ms = new MemoryStream();
        XmlWriter xw = XmlWriter.Create(ms);
        oldMessage.WriteMessage(xw);
        xw.Flush();
        string body = Encoding.UTF8.GetString(ms.ToArray());
        xw.Close();

        body = body.Replace(from, to); ////  Can see the body being changed here. 

        ms = new MemoryStream(Encoding.UTF8.GetBytes(body));
        XmlDictionaryReader xdr = XmlDictionaryReader.CreateTextReader(ms, new XmlDictionaryReaderQuotas());
        Message newMessage = Message.CreateMessage(xdr, int.MaxValue, oldMessage.Version);
        newMessage.Properties.CopyProperties(oldMessage.Properties);
        return newMessage;
    }

Код вызова ниже

public void ProvideFault(Exception error, MessageVersion messageVersion, ref Message fault)
{
    var faultException = new FaultException(error.Message);
    var messageFault = faultException.CreateMessageFault();
    var message = Message.CreateMessage(messageVersion, messageFault, null);
    
    message = ChangeString(message, message.ToString(), $"<?xml version=\"1.0\" encoding=\"UTF-8\"?>{message.ToString()}");

    fault = new ProposalMessage(message);
}

Итак, вопрос в том, как мне отправить сообщение пользователю с правильной кодировкой xml вверху?

Полный ответ, который я получаю:

<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<SOAP-ENV:Body>
    <SOAP-ENV:Fault>
        <faultcode>SOAP-ENV:Client</faultcode>
        <faultstring xml:lang="en-GB">Unable to satisfy web service request at this time.This may relate to the format or sequence of the requests, the status of the requested information or reflect a service issue.</faultstring>
    </SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

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

var errorFormatter = new ErrorMessageFormatter(new CustomTextMessageEncoderFactory("text/xml", "UTF-8", messageVersion));
var errorByteArray = errorFormatter.WriteMessage(Message.CreateMessage(messageVersion, messageFault, null), int.MaxValue, BufferManager.CreateBufferManager(int.MaxValue, int.MaxValue));
var message = errorFormatter.ReadMessage(errorByteArray, BufferManager.CreateBufferManager(int.MaxValue, int.MaxValue));

fault = new ProposalMessage(message);

Это то, что я добавил, что также удаляет SOAP -ENV из ошибки.

1 Ответ

0 голосов
/ 22 июня 2020

Версия и кодировка сообщения связаны с используемой привязкой. Обычно мы изменяем кодировку сообщения в привязке следующим образом:

 var binding = new BasicHttpBinding()
            {
                
                TextEncoding = Encoding.GetEncoding("UTF-8"),
            };

Мы также можем изменить версию и кодировку сообщения путем настройки кодировщика сообщений следующим образом:

 public CustomTextMessageBindingElement(string encoding, string mediaType)
            : this(encoding, mediaType, MessageVersion.Soap11WSAddressing10)
        {
        }

        public CustomTextMessageBindingElement(string encoding)
            : this(encoding, "text/xml")
        {

        }

        public CustomTextMessageBindingElement()
            : this("UTF-8")
        {
        }

Для получения дополнительных сведений о пользовательском кодировщике сообщений перейдите по следующей ссылке:

https://docs.microsoft.com/en-us/dotnet/framework/wcf/samples/custom-message-encoder-custom-text-encoder

...