2011-12-19 13 views
14

Próbuję użyć klienta testowego WCF do przetestowania usługi WCF, którą zbudowałem.Metoda usługi WCF jest niedostępna w kliencie testującym WCF, ponieważ używa typu

Usługa ma jedną metodę "SubmitRequest".

[OperationContract] 
Response SubmitRequest(Request request); 

Kiedy załadować górę testowego klienta WCF, metoda jest nieaktywna z komunikatem „Ta operacja nie jest obsługiwana w Klienta WCF testu, ponieważ używa typ WcfLibrary.Objects.Request

Poniżej definicja typu, czy ktoś zobaczyć coś złego?

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

Dzięki.

EDIT w/odpowiedzi ...
Operacja nie była dostępna za pośrednictwem klienta testowego WCF, ponieważ typ MspWebCallType miał właściwość typu Hashtable. Po usunięciu tej właściwości naprawiono problem. Dzięki za pomoc wszystkich.

+0

Czy WSDL odwołuje się do XSD dla klasy "Żądanie"? –

+0

Czy próbowałeś: [OperationContract] [KnownType (typeof (Request))] Response SubmitRequest (Żądanie żądania); – kd7

+0

Pytanie: Czy twoja klasa Request faktycznie znajduje się w przestrzeni nazw WcfLibrary.Objects? –

Odpowiedz

26

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).

Źródło: MSDN

Sprawdź Msp.FavReadViews i Msp.DsReadIndicators celu określenia ich zgodności.

+0

Msp.FavReadViews i Msp.DsReadIndicators są zdefiniowane wewnątrz referencyjnego projektu biblioteki klas. Są to proste wyliczenia, ale nie mają atrybutów EnumMember. Usunąłem te 2 właściwości z typu Zapytanie i nadal napotykam ten sam problem. Dzięki. – thiag0

+0

@ igby-largeman dzięki za dogłębną listę, również wydaje się, że typ "Typ" nie jest obsługiwany. Jeśli masz szansę, dodaj go do swojej listy. – Gent

+0

Dlaczego w tym łączu wyjaśniono, jak [Włącz strumieniowanie] (http://msdn.microsoft.com/en-us/library/ms789010.aspx) –

0

Może to być spowodowane tym, że Request potrzebuje publicznego konstruktora nieparametrycznego.

+0

Próbowałem dodać konstruktora bez parametrów, ale to nie rozwiązało problemu. – thiag0

+0

Cóż, czy klient testowy WCF nie wspiera twojej definicji usługi dla ciebie? Działa tylko dla względnie prostych interfejsów serwisowych. Zwykle używam SoapUI do testowania moich usług. –

+0

Również burza WCF jest świetna. –

0

Odpowiadając tutaj, ponieważ jest to pierwszy wynik w Google obecnie tego błędu:

Oprócz odpowiedzi @Igby Largeman „s, można również otrzymać ten błąd, jeśli gdzieś w operacji lub danych umów, masz używał typu, który nie jest możliwy do serializacji.

Weźmy przykład klasy Exception w .NET ...

miałem przypadek w którym deweloper w moim zespole zdecydowała się odesłać przedmiot wyjątek klienta dla usługi poprzez DTO, zamiast umieścić komunikat o wyjątku do DTO ręcznie. Visual Studio nie ostrzeże Cię w czasie kompilacji (tak naprawdę powinno), że nie można jej przekształcić w klasę, to się nie powiedzie w czasie wykonywania.

Jeśli otrzymujesz ten błąd i wykluczyłeś powyższą odpowiedź, upewnij się, że sprawdziłeś typy używane w Twoich umowach i DTO; coś, co nie jest serializowalne, może być twoim winowajcą.

Mam nadzieję, że to kogoś oszczędza.

0

Miałem ten sam błąd i problem polegał na tym, że klasa miała właściwość System.Drawing.Image. Usuwam go z klasy i zadziałało. Konwertuję tablicę bajtową na ciąg base64.

Powiązane problemy