2011-12-19 13 views
14

Sto provando a utilizzare il client di test WCF per verificare un servizio WCF che ho creato.Metodo di servizio WCF non disponibile nel client di test WCF perché utilizza il tipo

Il servizio ha un metodo "SubmitRequest".

[OperationContract] 
Response SubmitRequest(Request request); 

Quando carico la prova WCF client, il metodo è in grigio con il messaggio "Questa operazione non è supportata nel client di prova WCF perché utilizza tipo WcfLibrary.Objects.Request

Di seguito la definizione del tipo, qualcuno vede nulla di sbagliato?

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

Grazie.

EDIT w/risposta ...
il operazione non era disponibile tramite il client di test WCF perché il tipo MspWebCallType aveva una proprietà di tipo Hashtable. Una volta rimossa questa proprietà è stato risolto il problema. Grazie per l'aiuto di tutti.

+0

Il WSDL fa riferimento a XSD per la classe "Richiesta"? –

+0

Hai provato: [OperationContract] [KnownType (typeof (Request))] Response SubmitRequest (richiesta di richiesta); – kd7

+0

Una domanda: la tua classe di richiesta è effettivamente all'interno del namespace WcfLibrary.Objects? –

risposta

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

Fonte: MSDN

Controllare Msp.FavReadViews e Msp.DsReadIndicators per garantire la conformità.

+0

Msp.FavReadViews e Msp.DsReadIndicators sono definiti all'interno di un progetto di libreria di classi di riferimento. Sono enumerazioni semplici ma non hanno gli attributi EnumMember. Ho rimosso queste 2 proprietà dal tipo Richiesta e riscontro ancora lo stesso problema. Grazie. – thiag0

+0

@ igby-largeman grazie per l'elenco approfondito, inoltre sembra che il tipo di "Tipo" non sia supportato. Se ne hai la possibilità, aggiungilo alla tua lista. – Gent

+0

Perché in questo collegamento viene spiegato come [Abilita streaming] (http://msdn.microsoft.com/en-us/library/ms789010.aspx) –

0

Potrebbe essere perché Request deve avere un costruttore pubblico non parametrico.

+0

Ho provato ad aggiungere un costruttore senza parametri ma questo non ha risolto il problema. – thiag0

+0

Bene, il client di test WCF non supporta la definizione del servizio per voi? Funziona solo con interfacce di servizio relativamente semplici. Di solito utilizzo SoapUI per testare i miei servizi. –

+0

Inoltre, WCF Storm è eccezionale. –

0

Rispondere qui come questo è il primo risultato su Google attualmente per questo errore:

Oltre alla risposta @Igby Largeman s', riceverete anche questo errore se da qualche parte nel vostro funzionamento o di dati contratti, avete usato un tipo che non è serializzabile.

Prendiamo un esempio della classe Exception in .NET ...

ho avuto un caso in cui uno sviluppatore nella mia squadra aveva scelto di rispedire l'oggetto eccezione al client del servizio tramite un DTO, piuttosto che mettere il messaggio di eccezione nel DTO manualmente. Visual Studio non ti avviserà al momento della compilazione (dovrebbe, davvero), che la classe non sia serializzabile, fallirà solo in fase di runtime.

Quindi, se si riceve questo errore ed è stata esclusa la risposta di cui sopra, assicurarsi di controllare i tipi utilizzati nei contratti e DTO; qualcosa che non è serializzabile potrebbe essere il tuo colpevole.

Spero che questo salvi qualcuno un po 'di tempo.

0

Ho avuto lo stesso errore e il problema era che la classe aveva una proprietà System.Drawing.Image. Lo rimuovo dalla classe e ha funzionato. Converto l'array di byte in una stringa base64.

Problemi correlati