Search code examples
c#wcf

Operation not supported in the WCF Test Client


I created a WCF service and to the default service I added another operation contract on the main DataContract:

[OperationContract]
void DoSomething(UserData data);

Then I have something like this (simplified for the purpose of example) below. The problem is that even though ALL classes in the hierarchy are decorated with DataContract and ALL their members decorated with DataMember, when I use the WCF Test Client it has a red icon indicating that "the operation is not supported in the WCF test client".

[DataContract]
public class UserData {
   [DataMember]
   public uint One { get; set; }

   [DataMember]
   public CompositeType Extra { get; set; }

   public UserData() { ctor. code }
}


[DataContract]
public class CompositeType {
    [DataMember]
    public uint Two { get; set; }

    public UserData() { ctor code }
}

Solution

  • Add the attribute to your 'UserData' class [KnownType(typeof(CompositeType))]

    Like:

    [DataContract]
    [KnownType(typeof(CompositeType))]
    public class UserData 
    {
       [DataMember]
       public uint One { get; set; }
    
       [DataMember]
       public CompositeType Extra { get; set; }
    
       public UserData() { ctor. code }
    }
    

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

    Edit:

    http://msdn.microsoft.com/en-us/library/system.operatingsystem.aspx

    The OperatingSystem class has a few properties which relate to other classes. You could include all these classes in the known types but the dependency chain could get rather large and I would highly recommend not using the Operating System class at all.

    You should work out what information you actually need from the Operating System class and create your own DTO to pass back in the response. That way you can ensure all the types are easily definable on your contract.