【问题标题】:Add wcf reference: the file Reference.cs can not generate [System.Runtime.Serialization.DataContractAttribute(Name="ClassName", Namespace="..."] [closed]添加 wcf 引用:文件 Reference.cs 无法生成 [System.Runtime.Serialization.DataContractAttribute(Name="ClassName", Namespace=".​​.."] [关闭]
【发布时间】:2017-08-01 17:33:07
【问题描述】:

添加 wcf 引用:文件 Reference.cs 无法生成 [System.Runtime.Serialization.DataContractAttribute(Name="ClassName", Namespace=".​​.."] 但生成 [System.Xml.Serialization.XmlTypeAttribute(Namespace ="...")] 在 className(DataContract) 之上。例如: 但我想让 Reference.cs 生成以下代码:

怎么做? 如果是 [System.Xml.Serialization.XmlTypeAttribute(Namespace=".​​..")] ,则 wcf 传递参数 ClassName 的实例导致 ClassName 的 Int32 FieldName = 0。 但是如果是[System.Runtime.Serialization.DataContractAttribute(Name="ClassName", Namespace=".​​.."],wcf 传递参数ClassName 的实例可以得到正确的值。

如何解决?

我的服务器界面:

我的模特:

【问题讨论】:

标签: c# .net wcf serialization visual-studio-2013


【解决方案1】:

DataContract 序列化程序是 WCF 的默认值。在您的情况下使用 XML 序列化程序有几个可能的原因:

  1. 如果架构与 DataContractSerializer 不兼容,则选择 XmlSerializer。详情请查看article

  2. 属性 XmlSerializerFormat 应用于服务

您能否检查以上几点是否是您的情况? 如果它不适合您,请提供UserPrivilegeInfo 的定义和您的服务合同(接口和实现类)

更新:

好的,现在我们已经确定强制使用 XmlSerializer 是由返回的 DataSet 引起的。

从 WCF 服务返回 DataSet 通常是一种不好的做法。 这些文章解释了原因:

Returning DataSets from WebServices is the Spawn of Satan and Represents All That Is Truly Evil in the World

Why returning dataset or data table from WCF service is not a good practice? What are the Alternatives?

考虑返回DTO(数据传输对象)而不是混乱的DataSet。您只需填写 DataSet 中的 DTO 字段并将 DTO 传输到客户端。客户端通过IdName等字段通过强类型DTO访问数据。

在您的情况下,请按以下方式重新定义方法 GetCenterWebUser()

    [DataContract]
    public class CenterWebUser
    {
        [DataMember]
        public string Name { get; set; }

        [DataMember]
        public string Email { get; set; }

        //  Other fields for the user
    }

    public class SomeService : ISomeService
    {
        public CenterWebUser GetCenterWebUser()
        {
            DataSet ds = ...;

            var userTable = ds.Tables["Users"];
            var userRow = userTable.Rows[0];

            return new CenterWebUser()
            {
                Name = userRow.Field<string>("Name"),
                Email = userRow.Field<string>("Email")
                // ...
            };
        }
    }
}

【讨论】:

  • 我已经上传了我的服务器接口和模型?你能帮帮我吗?谢谢!
  • 图片中,UserPrvilegeInfo 信息被剪切。 DownloadNum 是此 DataContract 中的最后一个字段吗?是否可以复制/粘贴真实代码sn-ps,而不是代码截图?
  • 非常感谢您!
  • @CodeFuller - 所以我最初的怀疑是正确的。走我!但是,我为您 +1 是因为您的答案显然更好,并且因为您链接到了撒旦的产物文章。苹果,还是一个上面有苹果图片的盒子?
  • @tom redfern,谢谢大家!我学到了很多关于你们所有人的知识!
【解决方案2】:

您正在使用 DataSet 作为返回类型。这几乎肯定是 WCF 回退到 XmlSerializer 而不是使用 DataContractSerializer 的原因。

DataContractSerializer 有一组严格的rules 关于它支持的序列化类型,还有一组更严格的rules 关于它支持的 XSD。通过在服务边界上公开 DataSet,您几乎可以肯定违反了这些规则。

  1. 删除数据集。
  2. 你是金子!

另一件事 - 为什么服务引用上的声明性属性是 XmlTypeAttribute 还是 DataContractAttribute 对您来说很重要?这对消费者来说应该无关紧要。

您有权访问服务代码吗?如果我是你,我会完全放弃服务引用,直接使用ChannelFactory&lt;T&gt; 使用服务。服务参考是complex, unpredictable, indirect, and often do not work

当然,一旦您从返回类型中删除了可笑的 DataSet。

【讨论】:

  • 在粘贴的代码中,DataContract 中没有 DataSet 成员。此外,我创建了测试 WCF 服务返回 DataContract 和 DataSet 字段,默认情况下它使用 DataContract 序列化程序进行序列化。
  • @CodeFuller 您是否尝试过返回数据集的操作?
  • 是的,我已经按照超人的代码试过了。
  • @tom redfern,太好了!我已经删除了 DataSet ,它可以工作并且使用 DataContract 序列化程序进行序列化。但是我需要返回DataSet类型,如何解决?
  • @CodeFuller,你是如何在接口中测试返回 DataSet 类型的?你能帮帮我吗?
猜你喜欢
  • 2013-04-13
  • 2010-11-27
  • 1970-01-01
  • 1970-01-01
  • 2014-03-22
  • 1970-01-01
  • 2012-03-02
  • 2013-12-06
  • 2012-08-11
相关资源
最近更新 更多