Передача XML в автономный сервис WCF с использованием PostAsync - PullRequest
0 голосов
/ 16 мая 2018

Допустим, я создал следующую службу WCF, используя BasicHttpsBinding:

[ServiceContract]
    public interface IHelloWorld
    {
        [OperationContract]
        void HelloWorld();
    }

Как мне изменить его, чтобы можно было обрабатывать следующий запрос PostAsync, содержащий данные XML?

httpContent = new StringContent(xmlDoc.ToString(), Encoding.UTF8, "application/xml");
httpClient.PostAsync(requestURI, httpContent);

Или есть лучший способ сделать это?

Спасибо!

Юхан

1 Ответ

0 голосов
/ 23 мая 2018

Вот мое решение. Мне пришлось столкнуться с несколькими проблемами: какую привязку выбрать (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.

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