2010-03-18 13 views
4

J'ai mis l'attribut [FaultContract(typeof(ExceptionDetail))] pour mon contrat d'exploitation. Lorsque j'essaie d'ajouter le service à une application cliente, j'obtiens cette erreur - "Custom tool error: Failed to generate code for the service reference 'ServiceReference1'. Please check other error and warning messages for details."WCF: FaultContract (typeof (ExceptionDetail)) numéro

Mais lorsque je commente l'attribut FaultContract, je peux ajouter la référence de service wcf à mon application cliente.

Répondre

2

Retirez que FaultContract, et au lieu configurer includeExceptionDetailInFaults:

<system.serviceModel> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="Behavior"> 
      <serviceDebug includeExceptionDetailInFaults="true"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 
+0

J'utilise le même paramètre – user296598

+0

@jitus: dans ce cas, vous n'avez pas besoin de lister cette exception. –

+0

Selon [MSDN] (https://msdn.microsoft.com/en-us/library/system.servicemodel.servicebehaviorattribute.includeexceptiondetailinfaults%28v=vs.110%29.aspx), il est uniquement recommandé pour le débogage. Je ne peux pas dire pourquoi. – LosManos

9

Le point d'avoir FaultContracts est de permettre tout d'abord de passer en arrière défauts SOAP du service qui ne cassera pas le canal de communication entre la serveur et le client (gestion des conditions d'erreur comme exceptions .NET gracieusement et interopérabilité), et d'autre part, en utilisant FaultContracts, votre serveur que jeter les fautes typées (FaultException<T>) et votre client peut les attraper.

Si vous voulez ou devez être vraiment interopérable, vous devez:

  • définissent tous vos types FaultContract sous forme de classes décorées avec [DataContract] attribut
  • capture toutes les exceptions .NET sur le serveur (en utilisant par exemple l'interface IErrorHandler) et les transformer en défauts SOAP interopérables

Si vous contrôlez les deux extrémités du fil et les deux extrémités sont .NET, vous pouvez simplifier par une étape: sur le serveur, gérer tous .NET exceptions et les tourner dans par exemple FaultException<ArgumentOutOfRangeException>, à savoir, créer une « faute de (quelle que soit exception .NET) », puis sur le client, attraper les FaultException tapé et les manipuler:

[FaultContract(typeof(ArgumentOutOfRangeException)] 
[OperationContract] 
public void CallService(.......) 

puis dans votre implémentation, utilisez ceci:

try 
{ 
    clientProxy.CallService(); 
} 
catch(FaultException<ArgumentOutOfRangeException> ex) 
{ 
    // handle the most specific exception first 
} 
catch(FaultException ex) 
{ 
    // handle all other, unspecific server faults 
} 
catch(CommunicationException ex) 
{ 
    // handle all other, client-proxy related WCF errors 
} 
catch(Exception ex) 
{ 
    // handle anything else.... 
} 
0

J'ai eu le même problème il y a quelques minutes. Cela était dû à l'absence d'un constructeur par défaut. Souvenez-vous également que toutes les propriétés doivent avoir des accesseurs get/set publics.