Sharing Enum with WCF Service

后端 未结 4 2199
你的背包
你的背包 2020-12-13 08:53

I have few different applications among which I\'d like to share a C# enum. I can\'t quite figure out how to share an enum declaration between a regular application and a WC

相关标签:
4条回答
  • 2020-12-13 08:57

    I must have had some issues with an outdated service reference or something. I went back and created a common library containing the enum, and everything works fine. I simply added a using reference to the service interface's file.

    using Common;  
    
    [ServiceContract]
    [ServiceKnownType(typeof(MyEnum))]
    public interface IMyService
    {
        [OperationContract]
        ServiceMethod1( MyEnum e, string sUserId, string sSomeData);
    }
    

    and I dropped the following:

    [DataContract]
    public enum MyEnum{ [EnumMember] red, [EnumMember] green, [EnumMember] blue };
    

    I guess since the enum is referenced via ServiceKnownType, it didn't need to be marked up in the external library with [DataContract] or [Enumerator]

    0 讨论(0)
  • 2020-12-13 09:00

    Using the Common library should be fine. Enumerations are serializable and the DataContract attributes are not needed.

    See: http://msdn.microsoft.com/en-us/library/ms731923.aspx

    Enumeration types. Enumerations, including flag enumerations, are serializable. Optionally, enumeration types can be marked with the DataContractAttribute attribute, in which case every member that participates in serialization must be marked with the EnumMemberAttribute attribute

    EDIT: Even so, there should be no issue with having the enum marked as a DataContract and having client libraries using it.

    0 讨论(0)
  • 2020-12-13 09:03

    I had a quite weird problem and thought it might be interesting to you. I also had problems that I got a connection stop when I used enums in my data contract. It took me quite a while to find out what the real problem was: I used enums with int values assigned. They started by 1 instead of 0. Obviously WCF requires that there is an enum value equal to 0 for serialization. If you don't state any values within your enumeration, an automatic int value mapping will be done for you starting by 0, so everything's fine. But when you copy paste some other enum definition where the 0 value is not assigned you won't get that to your client through WCF - strange but true!

    0 讨论(0)
  • 2020-12-13 09:20

    you could assign int values to your Enum members and just use int's for transfer and when necessary cast them back into your Enum type

    0 讨论(0)
提交回复
热议问题