I created a WCF service and to the default service I added another operation contract on the main DataContract:
[OperationContract]
void DoSomething(UserData
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.
OK, having gone through the whole thing (thanks to all for the tips) the solution was this:
IsReference
attribute in DataContract
was not needed at allIsOneWay
attribute in DataContract
was not needed at all even when OperationContract
was returning void.KnownType
was also not needed provided all the subtypes in the hierarchy were mine, in other words defined by me rather than .NET and marked with DataContract
or DataMember
as appropriateOperatingSystem
and building a wrapper DataContract
that extracted the necesary information from OperatingSystem
got around the issue.Now there is no error in the WCF Test Client
The WCF default expectation for a service call is request-response - WCF expects some kind of a response back.
If you want to use void
(as in: no return value), you need to decorate those methods with
[OperationContract(IsOneWay = true)]
void DoSomething(UserData data);
to tell the WCF runtime not to expect any return value from the call
Read more about WCF: Working with One-Way Calls, Callbacks and Events here in MSDN Magazine.
Does the service work if you create a test client(like a console app) and add a service reference to the wcf? If it does, then your datacontract probably has one of those types not supported by WCF Test client.
See this related issue