Я пытаюсь использовать веб-сервис в .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. Я искал альтернативы, но пока ничего не нашел.
Пожалуйста, кто-нибудь может мне помочь?