【问题标题】:when WCF method returns XmlElement , the client sees XElement returned?当 WCF 方法返回 XmlElement 时,客户端看到 XElement 返回了吗?
【发布时间】:2010-09-18 11:22:23
【问题描述】:

我从 WCf 方法返回一个 xmlElement。 当我在客户端进行服务引用时,相同的方法返回 XElement 而不是 XmlElement。 我尝试了所有方法:更新服务引用,创建新的服务引用,但没有帮助。

这是我的客户:

ServiceReference1.BasicServiceClient basicWCfClient = new ServiceReference1.BasicServiceClient();
        XmlElement xmlelement =  basicWCfClient.GetData(5); 
        basicWCfClient.Close();

我得到一个错误: “无法将类型 'System.Xml.Linq.XElement' 隐式转换为 'System.Xml.XmlElement'”

当方法在服务器端时:

 public XmlElement GetData(int value)
    {
        XmlDocument xmldoc = new XmlDocument();
        xmldoc.LoadXml("<msg><node1>Hello</node1><node2>World</node2><request_params><mynode>More</mynode></request_params></msg>");
        XmlElement xmlElement = xmldoc.DocumentElement;
        return xmlElement;
     }

和界面:

    [ServiceContract]
public interface IBasicService
{

    [OperationContract]       
    [WebGet(UriTemplate = "GetData?value={value}")] // Add support for HTTP GET Requests
    XmlElement GetData(int value);}

发生了什么事?

【问题讨论】:

    标签: xml wcf xelement


    【解决方案1】:

    转到Configure Service Reference 并检查Reuse types in referenced assemblies

    然后检查System.Xml如果你想要XmlElement或System.Xml.Linq如果你想要XElement

    另见this question

    【讨论】:

    • 对我不起作用。我试图删除服务引用并重新创建。我还尝试删除 System.Xml 引用并仅保留 System.Xml.Linq。但是,它仍然使用 XmlNode。
    • 您是取消选中 system.xml 框还是只是从项目中删除了引用?
    • 两种方式都试过了。我假设 WCF 尝试将 XElement 用于并非所有服务。一项服务具有soap、soap12 和http 绑定——使用System.Xml。另一个有soap和soap12 - System.Xml.Linq。
    • 顺便说一句,它在另一个方向工作 - 我可以将 System.Xml 用于这两个服务。所以,你的回答对我有帮助。谢谢。
    【解决方案2】:

    没有错。客户端不知道使用了哪种 .NET 类型,并且服务引用只通知它可以返回任何 XML。它接受 XML 并将其作为 XElement 提供。它是内置的行为,我认为 MS 选择它是因为更新和更舒适的 API。为什么需要返回 XmlElement 的方法?

    【讨论】:

    • 我的测试客户端确实是在 Framework 3.5 中编译的,但另一家公司(真正的客户端)不会有 Framework 3.5,它与 Framework 2.0 一起工作,它不会识别 XElement,因为 XElement 是 Framework 3.5。但是再想一想,当真正的客户端(具有框架 2.0 环境)将创建服务引用时,我的 WCF 服务会返回 XmlElement 吗?它不会返回 Xelement 吗?
    • 刚刚在框架 2.0 中尝试了来自 VS2005 的相同引用,它确实返回了 Xmlelement。框架环境是问题,谢谢!
    • 首先,当您在 .NET 2.0 中使用服务时,您将无法使用添加服务引用,因为 .NET 2.0 不支持 WCF。您必须使用 Add web reference,它只会使用 .NET 2.0 类型。
    • 他可能主要使用 2.0 和一些 3.0 库(有一个 3.0 版本),这基本上是 WCF。我以前见过,所以当他说 2.0 时,他的意思是 3.0,即 2.0 + WCF(可能还有其他一些东西,但我不确定还有什么)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    • 2018-01-24
    • 1970-01-01
    • 2012-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多