C# 在WCF中传递复杂类型的标准化方法是什么?

C# 在WCF中传递复杂类型的标准化方法是什么?,c#,wcf,argument-passing,C#,Wcf,Argument Passing,我是WCF的新手,目前我正在开发一个TCP WCF服务,我不确定我是否正确理解传递参数,因此我建议您发表评论并给出一个标准化的方法 为了弄清楚这一点,我开发了一个用于测试目的的小型服务,它只有一个方法,并且依赖于一个公开单个类的外部.NETDLL。 服务合约守则 [ServiceContract] public interface IMyService { [OperationContract] int Test1(actionType

我是WCF的新手,目前我正在开发一个TCP WCF服务,我不确定我是否正确理解传递参数,因此我建议您发表评论并给出一个标准化的方法

为了弄清楚这一点,我开发了一个用于测试目的的小型服务,它只有一个方法,并且依赖于一个公开单个类的外部.NETDLL。 服务合约守则

    [ServiceContract]
    public  interface IMyService
    {
        [OperationContract]
        int Test1(actionType at, calculationType ct, action a);
        [OperationContract]
        int Test2(DataSeries s);
    }
其中,
actionType
calculationType
action
是在外部dll中声明的枚举 而
DataSeries
是在dll中声明的类

dll中
DataSeries
类的原始定义仅由
[Serializable]
标记,其成员上没有
[DataMember]

我在客户端和服务器端使用第三个dll,令我惊讶的是,这两个应用程序都运行良好,没有将
[DataContract]
放在DataSeries类上,也没有在枚举内部使用任何
[EnumMember]
,在类内部使用
[DataMember]

那么到底发生了什么

另一个实验:

从客户端删除第三方并按原样使用服务 我发现vs2008生成枚举和
DataSeries
类,并用适当的属性标记它们? 像


所以对我来说,我使用[DataContract]s,传入一个参数,然后返回一个数据契约

这提供了更大的灵活性,因为我可以使用新的可选属性扩展数据契约,而不会破坏任何现有客户机

枚举我还为其创建数据联系人;因为我可以做同样的事情,在不破坏任何东西的情况下扩展枚举,并且我可以控制名称空间

[DataContract(Namespace = "http://namespace.mydomain.com/2009/05", Name = "ReferenceTypeData")]
public enum GenderEnum
{
    [EnumMember()]
    Unknown = 0,
    [EnumMember()]
    Male = 1,
    [EnumMember()]
    Female = 2
}
然后,您必须将服务合同标记为

[ServiceKnownType(typeof(GenderEnum))]
public interface IServiceContract
{
    ....
}
和属性由(通常为或)使用。如果要使用TCP绑定()公开端点,则只需要。请注意,使用DataContractSerializer,您只能将SerializableAttribute添加到类中,它将自动序列化所有字段

我建议您这样做:如果您希望您的服务具有互操作性,请使用basicHttpBinding并使用DataContract和DataMember属性标记您的类。如果您的客户端是.NET应用程序,请使用netTcpBinding并使用SerializableAttribute标记您的类

您还可以阅读本文以比较不同绑定


但不使用DataContract或任何 属性,我找到了客户端 工作正常

是的,这是真的-如果您使用的数据类型没有用[DataContract]标记,WCF将尝试在这些数据类型上使用默认的SOAP序列化程序,只序列化所有公共的数据(所有公共属性)

它是有效的——但它可能不是您想要/期望的——所以我同意darin的观点——只是总是在您的类型上使用显式的[DataContract]属性。您对自己(或以后需要维护代码的其他程序员)的意图越清楚越好。这些发生在幕后的“魔术”有时会引起混乱-你最好不要太依赖它们


Marc

但在不使用DataContract或任何属性的情况下,我发现客户端工作正常这是一个很好的答案,您能推荐给我有关WCF或MSDN详细信息的链接/站点或书籍吗?
[ServiceKnownType(typeof(GenderEnum))]
public interface IServiceContract
{
    ....
}