Как установить кодировку в SOAP-запросе? - PullRequest
0 голосов
/ 07 января 2019

Я пытаюсь использовать веб-сервис в .NET Core 2.0 с помощью SOAP. Клиент для веб-службы был создан с помощью функции «Подключенная служба» Visual Studio.

Теперь у меня проблема, что веб-сервису в запросе нужна (первая) строка с атрибутом encoding:

<?xml version="1.0" encoding="utf-8"?>

Я пробовал много разных способов записать эту строку в выходной XML, но ничего не работает.

Первый подход:

Я добавил новое поведение конечной точки (путем реализации IEndpointBehavior) для клиента с помощью настраиваемого инспектора сообщений (путем реализации IClientMessageInspector). В результате отладки я обнаружил, что объект сообщения содержит указанную строку. Но при записи исходящего XML в веб-сервис, строка отсутствует.

Второй подход:

Я написал настраиваемый элемент связывания кодировки сообщений с расширением экспорта wsdl (используя MessageEncodingBindingElement & IWsdlExportExtension). Этот элемент привязки использует настраиваемый кодер MessageEncoder, где кодировка устанавливается явно. Я добавил привязку к сгенерированному клиенту.

Вот некоторые фрагменты кода .net 4.6:

// Binding for the client
TextMessageBindingElement textBindingElement = new TextMessageBindingElement();
textBindingElement.Encoding = "utf-8";
textBindingElement.MessageVersion = MessageVersion.Soap11;
textBindingElement.MediaType = "text/xml";

bindingElements.Add(textBindingElement);

CustomBinding binding = new CustomBinding(bindingElements);

// Customized Message Binding Element for encoding
public class TextMessageBindingElement : MessageEncodingBindingElement, 
IWsdlExportExtension {

    public override MessageVersion MessageVersion { get; set; }
    public string Encoding { get; set; }

    ...

    public override MessageEncoderFactory CreateMessageEncoderFactory() {
        return new TextMessageEncoderFactory(MediaType, Encoding, MessageVersion);
    }

    void ExportContract(WsdlExporter exporter, WsdlContractConversionContext context) {
    }

    void ExportEndpoint(WsdlExporter exporter, WsdlEndpointConversionContext context) {
         TextMessageEncodingBindingElement mebe = new TextMessageEncodingBindingElement();
         mebe.MessageVersion = this.msgVersion;
         ((IWsdlExportExtension) mebe).ExportEndpoint(exporter, context);
    }
}

В .NET 4.6 это работает, но .NET Core 2.0 не поддерживает IWsdlExportExtension. Я искал альтернативы, но пока ничего не нашел.

Пожалуйста, кто-нибудь может мне помочь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...