Operation not supported in the WCF Test Client

前端 未结 4 691
没有蜡笔的小新
没有蜡笔的小新 2021-01-18 13:01

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

[OperationContract]
void DoSomething(UserData         


        
相关标签:
4条回答
  • 2021-01-18 13:36

    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.

    0 讨论(0)
  • 2021-01-18 13:37

    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

    0 讨论(0)
  • 2021-01-18 13:44

    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.

    0 讨论(0)
  • 2021-01-18 13:45

    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

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