我正在尝试更新一些返回字符串以返回XmlDocument对象的WCF服务方法。我已经尝试将其原样返回并将其封装在datacontract对象中。无论哪种方式,我在尝试更新服务引用时遇到错误。该错误建议将其封装在具有我正在执行的操作合同的数据合同中。这有诀窍吗?
答案 0 :(得分:2)
有一种方法可以从WCF返回XmlDocument,但是您需要使用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 :(得分:1)
如果您希望能够在线路上传递任意XML,最好的方法是使用XElement而不是XmlDocument
XmlDocument不可序列化