Вот мое решение. Мне пришлось столкнуться с несколькими проблемами: какую привязку выбрать (WebHttpBinding), иметь дело с PostAsync (асинхронный в методе синхронизации) и помешать StringWriter изменить UTF8 на UTF16.
На стороне сервера интерфейс выглядит так:
[ServiceContract]
[XmlSerializerFormat]
public interface IHelloWorld
{
[OperationContract]
[WebInvoke(Method = "POST",
RequestFormat = WebMessageFormat.Xml,
BodyStyle = WebMessageBodyStyle.Bare,
UriTemplate = "")]
void HelloWorld(MyRequest request);
}
Атрибут XmlSerializerFormat указывает, что WCF должен использовать XMLSerializer вместо DataContractSerializer по умолчанию. Чтобы это работало, класс MyRequest должен быть правильно аннотирован с помощью [XmlElement], [XmlAttribute] и т. Д., См. https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/using-the-xmlserializer-class.
Здесь я настраиваю хост WCF:
WebServiceHost host = new WebServiceHost(typeof(HelloWorldService));
WebHttpBinding binding = new WebHttpBinding();
binding.Security.Mode = WebHttpSecurityMode.Transport;
var endpoint = host.AddServiceEndpoint(typeof(IHelloWorld), binding, _address);
endpoint.Behaviors.Add(new WebHttpBehavior());
host.Open();
На стороне клиента код теперь выглядит так:
var _serializer = new XmlSerializer(typeof(MyRequest));
StringContent _httpContent;
// We need to keep UTF8 encoding here (StringWriter uses UTF16 by default)
using (StringWriter _textWriter = new Utf8StringWriter())
{
_serializer.Serialize(_textWriter, _ebicsRequest);
_httpContent = new StringContent(_textWriter.ToString(), Encoding.UTF8, "application/xml");
}
HttpClient _httpClient = new HttpClient();
var task = _httpClient.PostAsync(_requestURI, _httpContent).Result;
Я нашел класс Utf8StringWriter здесь: https://stackoverflow.com/a/25731993/9266796.