2012-01-21 2 views
0

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

+0

Trick is: do not do it. Либо верните строку как есть, либо даже лучше: почему вы возвращаете что-то неуклюжие, как XML? Точка веб-сервисов заключается в том, что они абстрагируют XML goo - вы должны работать с надлежащими бизнес-объектами (и их списками). –

+0

Я согласен - вы не должны возвращать типы, такие как XmlDocument, через провод. –

+0

Если вы действительно хотите получить решение или ответ на свой вопрос, я предлагаю вам обновить свой вопрос примерами вашего кода, сообщения об ошибках от компилятора и т. Д. – Kyberias

ответ

2

Там есть способ вернуть 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

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

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

Смежные вопросы