0

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

为了弄清楚我开发了一个用于测试目的的小型服务,它具有单一方法并依赖于公开单个类的外部 .Net dll。服务合同代码

    [ServiceContract]
    public  interface IMyService
    {
        [OperationContract]
        int Test1(actionType at, calculationType ct, action a);
        [OperationContract]
        int Test2(DataSeries s);
    }

其中 actionType, calculationType,action是在外部 dll 中声明的枚举,是在 dllDataSeries中声明的类。

dll 中类的原始定义在其成员上DataSeries标记为[Serializable]only 而 no 。[DataMember]

我在客户端和服务器端使用第三个 dll,令我惊讶的是两个应用程序都可以正常工作,而无需放入[DataContract]DataSeries 类,也无需使用任何[EnumMember]内部枚举,[DataMember]内部类。

那么发生了什么?

另一个实验:

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

    [System.CodeDom.Compiler.GeneratedCodeAttribute      ("System.Runtime.Serialization", "3.0.0.0")]
    [System.Runtime.Serialization.DataContractAttribute(Name="actionType",  Namespace="http://schemas.datacontract.org/2004/07/DBInterface")]
    public enum actionType : int {

        [System.Runtime.Serialization.EnumMemberAttribute()]
        All = 0,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Buy = 1,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Sell = 2,
    }
4

3 回答 3

1

DataContractDataMemberEnumMember属性由DataContractSerializer(通常是basicHttpBindingwsHttpBinding)使用。如果您使用 TCP 绑定 ( netTcpBinding )公开端点,则只需要SerializableAttribute。请注意,使用 DataContractSerializer 您只能将 SerializableAttribute 添加到您的类中,它会自动序列化所有字段。

我会向您推荐以下内容:如果您希望您的服务可互操作,请使用 basicHttpBinding 并使用 DataContract 和 DataMember 属性标记您的类。如果您的客户端是 .NET 应用程序,请使用 netTcpBinding 并使用 SerializableAttribute 标记您的类。

您还可以阅读这篇文章以比较不同的绑定。

于 2009-05-02T13:06:36.873 回答
1

但是没有使用 DataContract 或任何属性,我发现客户端工作正常

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

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

马克

于 2009-05-02T14:05:25.390 回答
0

所以对我来说,我使用 [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
{
    ....
}
于 2009-05-02T12:47:32.270 回答