Lord of Scripts
Lord of Scripts

Reputation: 3619

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 }
}

Upvotes: 7

Views: 30176

Answers (4)

Lord of Scripts
Lord of Scripts

Reputation: 3619

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 all
  • IsOneWay 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 appropriate
  • Getting rid of OperatingSystem 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

Upvotes: 5

Phill
Phill

Reputation: 18814

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.

Upvotes: 4

marc_s
marc_s

Reputation: 755471

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.

Upvotes: 0

kjosh
kjosh

Reputation: 133

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

Upvotes: 0

Related Questions