WCF service method unavailable in WCF Test Client because it uses type
Asked Answered
D

4

14

I am trying to use the WCF Test Client to test a WCF service I have built.

The service has one method "SubmitRequest".

[OperationContract]
Response SubmitRequest(Request request);

When I load up the WCF Test Client, the method is grayed out with the message "This operation is not supported in the WCF Test Client because it uses type WcfLibrary.Objects.Request

Below is the type definition, does anyone see anything wrong?

[DataContract]
public class Request
{
    [DataMember]
    public string LoanNumber { get; set; }

    [DataMember]
    public string ClientCode { get; set; }

    [DataMember]
    public Region Region { get; set; }

    [DataMember]
    public RequestType RequestType { get; set; }

    [DataMember]
    public List<RequestParameter> RequestParameters { get; set; }

    [DataMember]
    public List<MspWebCallType> MspWebCallsForXmlRequest { get; set; }

    [DataMember]
    public Hashtable XmlRequestParameters { get; set; }

    public Request(string loanNumber, string clientCode, Region region, RequestType requestType, List<RequestParameter> requestParameters)
    {
        LoanNumber = loanNumber;
        ClientCode = clientCode;
        Region = region;
        RequestType = requestType;
        RequestParameters = requestParameters;
    }
}

[DataContract]
public class MspWebCallType
{
    [DataMember]
    public string WebService { get; set; }
    [DataMember]
    public string Operation { get; set; }
    [DataMember]
    public string Version { get; set; }
    [DataMember]
    public Hashtable Parameters { get; set; }
    [DataMember]
    public Msp.FavReadViews FAVReadViewIndicator { get; set; }
    [DataMember]
    public Msp.DsReadIndicators DSReadInidicator { get; set; }        
}

[DataContract]
public enum Region 
{ 
        [EnumMember]
        P2,
        [EnumMember]
        PROD 
}

[DataContract]
public enum RequestType
{
    [EnumMember]
    None,
    [EnumMember]
    XmlRequest,
    [EnumMember]
    SomeOtherRequestType
}

[DataContract]
public struct RequestParameter
{
    [DataMember]
    public string ParameterName { get; set; }

    [DataMember]
    public string ParameterValue { get; set; }
}

Thanks.

EDIT w/ answer...
The operation was not available via the WCF Test Client because the type MspWebCallType had a property of type Hashtable. Once I removed this property it fixed the issue. Thanks for everyone's help.

Duro answered 19/12, 2011 at 21:34 Comment(9)
Does the WSDL reference an XSD for the 'Request' class?Nurserymaid
Have you tried: [OperationContract] [KnownType(typeof(Request))] Response SubmitRequest(Request request);Behoof
A question: Is your Request class actually inside the namespace WcfLibrary.Objects?Mcclish
@Nurserymaid - I do not see any entries in the WSDL for the 'Request' class.Duro
Here's a long shot - the framework gets confused because "Request" is such an overloaded term. What happens if you change the type to "Request_X"?Mcclish
@kd7 - When I add the [KnownType] attribute I get the following error: "Attribute 'KnownType' is not valid on this declaration type. It is only valid on 'class, struct' declarations."Duro
@AndrewShepherd - The type is not named 'Request', I changed it for the post to keep it simple. Thanks.Duro
Commenting about your answer; does that mean only test client doesnt work or also wcf isnt supporting that type? Do you fetch that type on your WSDL?Weightless
@batmaci The Hashtable type is still supported by WCF. It's the default test client that comes with Visual Studio (WcfTestClient msdn.microsoft.com/en-us/library/bb552364(v=vs.110).aspx) that doesn't support that type.Duro
S
27

The following is a list of features not supported by WCF Test Client:

  • Types: Stream, Message, XmlElement, XmlAttribute, XmlNode, types that implement the IXmlSerializable interface, including the related XmlSchemaProviderAttribute attribute, and the XDocument and XElement types and the ADO.NET DataTable type.

  • Duplex contract.

  • Transaction.

  • Security: CardSpace , Certificate, and Username/Password.

  • Bindings: WSFederationbinding, any Context bindings and Https binding, WebHttpbinding (Json response message support).

Source: MSDN

Check Msp.FavReadViews and Msp.DsReadIndicators to ensure they comply.

Stavro answered 19/12, 2011 at 21:54 Comment(3)
Msp.FavReadViews and Msp.DsReadIndicators are defined inside a referenced class library project. They are simple enums but do not have the EnumMember attributes. I removed these 2 properties from the Request type and still experience the same issue. Thanks.Duro
@igby-largeman thanks for the in depth list, also it seems that the type of "Type" is not supported. If you get a chance please add it to your list.Bedding
Why in this link explain how to [Enable Streaming](msdn.microsoft.com/en-us/library/ms789010.aspx )Visby
E
0

It might be because Request needs to have a public non-parametric constructor.

Eleen answered 20/12, 2011 at 17:20 Comment(2)
I tried adding a parameterless constructor but that did not resolve the issue.Duro
Well, is the WCF Test Client not supporting your service definition a big deal for you? It works for relatively simple service interfaces only.. I usually use SoapUI for testing my services.Eleen
P
0

Answering here as this is the first result on Google currently for this error:

In addition to @Igby Largeman 's answer, you will also receive this error if somewhere in your operation or data contracts, you have used a type that is not serializable.

Take an example of the Exception class in .NET...

I had a case whereby a developer on my team had opted to send back the Exception object to the service's client via a DTO, rather than put the exception message into the DTO manually. Visual Studio will not warn you at build time (it should, really), that the class is not serializable, it will only fail at runtime.

So if you are receiving this error and have ruled out the answer above, ensure you check the types used in your contracts and DTOs; something not being serializable could be your culprit.

I hope this saves someone some time.

Perceptive answered 6/10, 2016 at 18:53 Comment(0)
F
0

I had the same error and the problem was that the class had an System.Drawing.Image property. I remove it from the class and it worked. I convert the byte array to a base64 string.

Forgive answered 30/4, 2017 at 22:25 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.