C# – Flags with web services


I have a flag attribute enumeration that is behind a web service as follows:

public enum AccessLevels
    None = 0,
    Read = 1,
    Write = 2,
    Full = Read | Write

My problem is the consumer of my web service does not have the original constant values of the enum. The resulting proxy class client side has something that amounts to this:

   None = 1,
   Read = 2,
   Write = 4,
   Full = 8

And thus when the consumer is checking for "Read" access this will be false even when "testItem" is "Full"

((testItem & Svc.Read) == Svc.Read)

How can I properly provide flags over a web service?


According to this article it may not be possible to do what I am looking to do. Ivan Krivyakov states

Imperfect Transparency of Enums

It turns out that enums are not as
transparent as we'd like them to be.
There are three sticky issues:

  1. If server-side code declares an enum and assigns specific numeric
    values to its members, these values
    will not be visible to the client.
  2. If server-side code declares a [Flags] enum with "compound" mask
    values (as in White = Red|Green|Blue),
    it is not properly reflected on the
    client side.
  3. If server or client transmits an "illegal" value which is outside of
    the scope of the enum, it causes an
    exception in XML de-serializer on the
    other side.

So I wonder if this is just a limitation and is not possible.

Best Solution

I have done extensive research on this and found that it is not possible to serialize enumeration constants through a web service. Note that to accomplish your goal you don't need the enumerations None or Full. These two enumerations can be implied with read / write combination:

You could assume full access if your AccessLevels = Read | Write and none if your AccessLevels = 0 [nothing]

Your enumerations would look like this:

public enum AccessLevels
    Read = 1,
    Write = 2