2009-12-29 19 views
7

Uso il servizio WCF nella mia applicazione. Devo restituire un oggetto personalizzato nella classe di servizio. Il metodo è il seguente:Servizio WCF: restituzione degli oggetti personalizzati

IService.cs: 
[OperationContract] 
object GetObject(); 

Service.cs 
public object GetObject() 
{ 
    object NewObject = "Test"; 
    return NewObject; 
} 

Ogni volta che faccio una chiamata al servizio, viene generata un'eccezione con il seguente messaggio:

System.ServiceModel.CommunicationException: "An error occured while receiving the HTTP response to <service path>" 

Eccezione interna:

System.Net.WebException: "The underlying connection was closed. An unexpected error occured on receive" 

Can Restituiamo tipi di oggetto o oggetti personalizzati dal servizio WCF?

+0

dove conduci il tuo servizio wcf? –

risposta

13

Si dovrebbe restituire un'istanza di una classe che è contrassegnato con l'attributo DataContract:

[DataContract] 
public class MyClass 
{ 
    [DataMember] 
    public string MyString {get; set;} 
} 

Ora cambiare la vostra interfaccia di servizio in questo modo:

[OperationContract]  
MyClass GetMyClass(); 

e il vostro servizio:

public MyClass GetMyClass()  
{  
    return new MyClass{MyString = "Test"};  
} 
1

È necessario restituire un tipo specifico, non "oggetto". Un "oggetto" potrebbe essere di qualsiasi tipo.

+0

mentre sono d'accordo sul fatto che si tratta di una progettazione scadente, ritengo che WCF dovrebbe essere in grado di gestire l'oggetto. – Steve

+2

"oggetto" è un carattere jolly. Significa che potresti restituire qualcosa. Dovrai dire a WCF che tipo di cosa potresti restituire, usando "ServiceKnownTypeAttribute". –

0

Gli oggetti personalizzati vanno bene, mentre MS dice che non è più necessario utilizzare gli attributi [DataContract] o [datamember], non ho avuto esito positivo senza di essi. Prova a contrassegnare l'oggetto personalizzato con gli attributi e vedere cosa sta succedendo. Puoi ottenere maggiori informazioni su ciò che accade esplicitamente attivando la traccia e usando svcutil per ottenere traccia.