2009-10-29 3 views
6

Ho un progetto di servizio WCF in Visual Studio 2008 che contiene circa 12 metodi, alcuni dei quali restituiscono tipi primitivi come bool o stringa. Ho anche un progetto di test dell'unità di Visual Studio che fa riferimento al servizio WCF pubblicato. Il Progetto di prova viene compilato correttamente quando tutti i tipi di ritorno sono primitivi.Servizio WCF che restituisce una classe personalizzata genera errori in Reference.cs

Se aggiungo un nuovo metodo al servizio che restituisce una classe personalizzata, lo pubblica e aggiorna il riferimento del servizio nel Progetto di test, non viene compilato. Gli errori sono: -

  1. Il tipo "PublisherFaultException" contiene già una definizione per "Motivo".
  2. Il tipo "PublisherFaultException" contiene già una definizione per "PropertyChanged".
  3. Digitare 'Publisher.Test.LibraryReference.PublisherFaultException' definisce già un membro chiamato 'RaisePropertyChanged' con gli stessi tipi di parametri.

tutto nel file reference.cs generato automaticamente.

Il contratto per il metodo del servizio WCF è: -

Page GetItem(string path); 

e la classe pagina ha l'attributo DataContract ed è proprietà pubbliche hanno l'attributo DataMember.

Sono riluttante a modificare il file Reference.cs in quanto sarà necessario farlo ogni volta che si aggiorna il servizio.

Qualcuno sa perché questo sta accadendo?

Stuart.

+0

cosa sta succedendo è che WCF add service reference is a bitch - I feel your pain – JohnIdol

+0

Hai provato a generare il proxy usando svcutil? Ricordo di aver riscontrato questo problema prima, ed era quando stavo creando eccezioni di errore personalizzate usando l'attributo FaultContract. Non ricordo la soluzione. Quindi spero che i miei commenti possano aiutare. Continuerò a scavare e vedere se riesco a trovare la soluzione. Prova SvcUtil.exe e guarda cosa succede e faccelo sapere. – CkH

risposta

1

Quando si aggiunge il riferimento del servizio, si ottiene un'opzione di riutilizzo dei tipi nell'assieme: è probabile che questa sia la chiave per l'eliminazione della duplicazione.

Oppure alcuni riferimenti di test che causano la duplicazione?

Inoltre, dai un'occhiata alla sezione Riferimenti dell'albero del progetto e controlla se c'è qualcosa di inaspettato (ci sono riferimenti a 2 assiemi che contengono riferimenti di servizio nello stesso spazio dei nomi?).

+0

Il "Tipi di riutilizzo in tutti gli assembly di riferimento" è selezionato. Dovrebbe essere così? La classe Page appartiene a un assembly che, mentre si trova nella soluzione VS, non viene referenziato direttamente dal progetto di test. –

+0

Il riutilizzo è generale, funziona bene, sebbene ci siano argomenti [prolissi] per evitare di condividere il contratto in questo modo. PublisherFaultException nell'assembly di contratti? È contrassegnato con gli attributi del contratto appropriati? (Non ho visto il caso esatto che stai vedendo, ma sarei root causandolo seguendo la scia dei riferimenti). Prendo il fatto che hai cliccato sul pulsante Mostra tutti i file nella parte superiore del progetto di esplorazione e guardato in references.cs per vedere il codice generato al fine di determinare con cosa potrebbe essere in conflitto? –

+0

La proprietà PublisherFaultexception si trova nel file Reference.cs generato automaticamente durante l'aggiornamento del riferimento del servizio. Contiene due dichiarazioni di classe per PublisherFaultException (entrambe le classi parziali che vanno bene), ma entrambe con la proprietà pubblica Reason, l'evento PropertyChanged e il metodo RaisePropertyChanged. La stessa classe ReportPublisherException si trova nel progetto WCF e ha gli attributi DataContact e DataMember. –

1

Utilizzare la classe proxy generata automaticamente è sempre un problema.

Per gestire situazioni di questo tipo, utilizzo un assembly separato con classi di contratto dati e interfaccia di servizio.

Contratto dll avrà:


public interface IService 
{ 
    [OperationContract] 
    List GetContentList(); 
} 

[DataContract] 
public class ContentItem 
{ 
    [DataMember] public string Name; 
    [DataMember] public object Data; 
} 

Il cliente dovrà riferimento alla Contract.dll. Proxy verrà creato manualmente:


class ServiceProxy : ClientBase<IService>, IService 
{ 
    public List GetContentList() 
    { 
    return Channel.GetContentList(); 
    } 
} 

La dll server avrà riferimento al medesimo contratto dll. Quindi saremo in grado di evitare qualsiasi errore con il proxy generato automaticamente. Anche il proxy creato manualmente sarà più semplice, più gestibile.

0

Quando si aggiunge il riferimento di servizio, provare a fare clic su Avanzate e selezionare "Genera operazioni asincrone".

Penso che quello che stava accadendo era che c'erano alcuni metodi asincroni nel servizio web, con nomi che terminavano in "Async", che sarebbe in conflitto con i metodi generati in References.cs.

ad es. Immagina che il servizio web contenga 2 metodi: (1) SayHello e (2) SayHelloAsync.

Generazione utilizzando il metodo basato attività predefinita produce:

  • SayHello e SayHelloAsync per (1)
  • SayHelloAsync e SayHelloAsyncAsync per (2).

Il conflitto si è verificato perché c'erano 2 metodi generati chiamati SayHelloAsync.

Almeno penso che sia quello che stava succedendo. In ogni caso, l'impostazione "Genera operazioni asincrone" ha funzionato per me.