Сериализация объекта в формате XML, ожидаемом конечной точкой WCF - PullRequest
2 голосов
/ 04 марта 2020

Мне нужно вызвать конечную точку WCF с помощью HTTPClient, который я уже понял, как это сделать. У меня проблема в том, что я не знаю, как кодировать сериализатор XML для создания работающей строки содержимого.

В моем коде у меня есть следующий тип:

public class MyParameters
{
    public string source { get; set; }
    public string key { get; set; }
    public string secret { get; set; }
    public TimeSpan lockExpirationTime { get; set; }
}

И я сериализирую это так:

var input = new MyParameters
{
    source = "some source",
    key = "some key",
    secret = "some secret",
    lockExpirationTime = new TimeSpan(0, 0, 10)
};

var serializer = new XmlSerializer(typeof(MyParameters));
var stringwriter = new System.IO.StringWriter();
serializer.Serialize(stringwriter, input);
var xml = stringwriter.ToString();

Конечным результатом является строка xml:

<?xml version="1.0" encoding="utf-16"?>
<MyParameters xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <source>some source</source>
  <key>some key</key>
  <secret>some secret</secret>
  <lockExpirationTime>PT10S</lockExpirationTime>
</MyParameters>

Но кажется, что конечная точка WCF будет счастлива, а не вернуть результат неверного запроса, xml должен выглядеть ТОЛЬКО так:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Body>
        <MyParameters xmlns="http://tempuri.org/">
            <source>some source</source>
            <key>some key</key>
            <secret>some secret</secret>
            <lockExpirationTime>PT10S</lockExpirationTime>
        </MyParameters>
    </s:Body>
</s:Envelope>

Как я могу заставить сериализатор дать мне этот результат? Я использую. Net Core 3.1

Спасибо.

1 Ответ

0 голосов
/ 05 марта 2020

Попробуйте xml linq:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string xml =
                "<?xml version=\"1.0\" encoding=\"utf-8\" ?>" + 
                   "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">" +
                        "<s:Body>" +
                        "</s:Body>" +
                   "</s:Envelope>";
            XDocument doc = XDocument.Parse(xml);
            XNamespace sNs = doc.Root.GetNamespaceOfPrefix("s");

            XElement body = doc.Descendants(sNs + "Body").FirstOrDefault();
            string source = "some source";
            string key = "some key";
            string secret = "secret";
            string lockExpirationTime = "PT10S";

            XNamespace def = "http://tempuri.org/";
            XElement myParameters = new XElement(def + "MyParameters");
            body.Add(myParameters);

            myParameters.Add(new object[] {
                new XElement(def + "source", source),
                new XElement(def + "key", key),
                new XElement(def + "secret", secret),
                new XElement(def + "lockExpirationTime", lockExpirationTime)
            });


            string xmlStr = doc.ToString();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...