Возврат XmlDocument из службы WCF не работает - PullRequest
0 голосов
/ 21 января 2012

Я пытаюсь обновить некоторые методы службы WCF, которые возвращают строки для возврата объектов XmlDocument. Я попытался вернуть его как есть и заключить в объект datacontract. В любом случае я получаю сообщение об ошибке при попытке обновить ссылку на службу. Ошибка предлагает заключить ее в дата-контракт с операционным контрактом, который я делаю. Есть ли хитрость в этом?

Ответы [ 2 ]

2 голосов
/ 21 января 2012

Есть способ вернуть XmlDocument из WCF, но вам нужно использовать XmlSerializer вместо сериализатора по умолчанию (DataContractSerialier) - код ниже показывает, как это можно сделать. Тем не менее, рассмотрите возможность использования объектов передачи данных, как указано в комментариях, если ваш сценарий действительно не требует передачи XmlDocument.

public class StackOverflow_8951319
{
    [ServiceContract]
    public interface ITest
    {
        [OperationContract]
        string Echo(string text);
        [OperationContract, XmlSerializerFormat]
        XmlDocument GetDocument();
    }
    public class Service : ITest
    {
        public string Echo(string text)
        {
            return text;
        }

        public XmlDocument GetDocument()
        {
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(@"<products>
  <product id='1'>
    <name>Bread</name>
  </product>
  <product id='2'>
    <name>Milk</name>
  </product>
  <product id='3'>
    <name>Coffee</name>
  </product>
</products>");
            return doc;
        }
    }
    static Binding GetBinding()
    {
        var result = new WSHttpBinding(SecurityMode.None);
        //Change binding settings here
        return result;
    }
    public static void Test()
    {
        string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
        ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress));
        host.AddServiceEndpoint(typeof(ITest), GetBinding(), "");
        host.Open();
        Console.WriteLine("Host opened");

        ChannelFactory<ITest> factory = new ChannelFactory<ITest>(GetBinding(), new EndpointAddress(baseAddress));
        ITest proxy = factory.CreateChannel();
        Console.WriteLine(proxy.Echo("Hello"));

        Console.WriteLine(proxy.GetDocument().OuterXml);

        ((IClientChannel)proxy).Close();
        factory.Close();

        Console.Write("Press ENTER to close the host");
        Console.ReadLine();
        host.Close();
    }
}
1 голос
/ 21 января 2012

Если вы хотите иметь возможность передавать произвольный XML по проводам, лучший способ сделать это - использовать XElement вместо XmlDocument

XmlDocument не сериализуем

...