Attiva IncludeExceptionDetailInFaults (da ServiceBehaviorAttribute o dal comportamento di configurazione <serviceDebug>) sul server


157

Ho un servizio WCF che ha funzionato perfettamente, e qualcosa è cambiato e non so cosa.

Ottengo questa eccezione:

System.ServiceModel.FaultException: il server non è stato in grado di elaborare la richiesta a causa di un errore interno. Per ulteriori informazioni sull'errore, attivare IncludeExceptionDetailInFaults (o da ServiceBehaviorAttribute o dal comportamento di configurazione) sul server per inviare le informazioni sull'eccezione al client o attivare la traccia secondo la documentazione SDK di Microsoft .NET Framework 3.0 e ispezionare i log di traccia del server.

Questo è confuso perché sto eseguendo .NET 4.0.

Dove accendo IncludeExceptionDetailInFaults? Sto lottando per trovarlo.

Risposte:


265

Definisci un comportamento nel tuo .configfile:

<configuration>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="debug">
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    ...
  </system.serviceModel>
</configuration>

Quindi applicare il comportamento al servizio in questo modo:

<configuration>
  <system.serviceModel>
    ...
    <services>
      <service name="MyServiceName" behaviorConfiguration="debug" />
    </services>
  </system.serviceModel>
</configuration>

Puoi anche impostarlo a livello di codice. Vedere questa domanda .


1
Ciao Otivel, nel mio caso ci sono cartelle nidificate contenenti siti e servizi diversi. La cartella in cui risiede il mio servizio e sto riscontrando un errore è al terzo grado di annidamento rispetto all'applicazione Web principale e ho web.config dedicato per ogni servizio. Modifica di conseguenza il mio web.config corrispondente per aggiungere <serviceDebug includeExceptionDetailInFaults = "true" />. Ma sto ancora ricevendo l'errore. Devo cambiare tutto il web.config nell'applicazione web completa?
MaxRecursion,

2
@AkshayKulkarni: Non sono sicuro, non ho esperienza con il tuo caso. Assicurati che i tuoi servizi abbiano prima un riferimento al comportamento del servizio (controlla la risposta di gagogra ). Se ciò non risolve il problema, fai una domanda su SO.
Otiel,

1
@MatthewLock: risposta aggiornata. Inoltre, controlla <behavior> e <service> se hai bisogno di maggiori dettagli.
Otiel,

1
Visual Studio mi dice che serviceBehaviors non può essere un figlio diretto di system.serviceModel. Ho finito con la risposta di rich.okelly.
Andrew

3
Nota: VS2013 inserisce il tag <serviceDebug> nel Web.config predefinito con esso impostato su false. Se non ti accorgi come non ho fatto io e aggiungi l'XML sopra apparentemente vince quello che è nell'ultimo file. Spero che questo sia utile a qualcuno là fuori.
Jeff,

63

È nel file app.config.

<configuration>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceDebug includeExceptionDetailInFaults="true"/>

9
Non impostare l'attributo name di <behavior> (come nella risposta @Otiel) se vuoi che si applichi a tutti i tuoi servizi.
Pashec,

47

Se vuoi farlo per codice, puoi aggiungere il comportamento in questo modo:

serviceHost.Description.Behaviors.Remove(
    typeof(ServiceDebugBehavior));
serviceHost.Description.Behaviors.Add(
    new ServiceDebugBehavior { IncludeExceptionDetailInFaults = true });

Aggiungi questo ServiceHostall'istanza dell'oggetto: Esempio:ServiceHost serviceHost = new ServiceHost(Program.serviceInstance);
Daniel Bonetti,

28

Puoi anche impostarlo nel tag [ServiceBehavior] sopra la tua dichiarazione di classe che eredita l'interfaccia

[ServiceBehavior(IncludeExceptionDetailInFaults = true)]
public class MyClass:IMyService
{
...
}

Immortal Blue ha ragione a non rivelare i dettagli dell'eccezione a una versione rilasciata pubblicamente, ma a scopo di test questo è uno strumento utile. Spegnere sempre quando si rilascia.


L'ho usato in un'applicazione che funziona sul back-end e non sarà mai visibile pubblicamente, quindi funziona perfettamente
AlbatrossCafe

4

Stavo anche ottenendo lo stesso errore, il WCF funzionava correttamente per me quando lo stavo usando nell'ambiente Dev con le mie credenziali, ma quando qualcun altro lo stava usando in TEST, stava lanciando lo stesso errore. Ho fatto molte ricerche e, invece di fare aggiornamenti di configurazione, ho gestito un'eccezione nel metodo WCF con l'aiuto dell'eccezione di errore. Inoltre, è necessario impostare l'identità per WCF con le stesse credenziali che hanno accesso al database, qualcuno potrebbe aver cambiato la tua autorità. Di seguito troverai il codice per lo stesso:

 [ServiceContract]
public interface IService1
{
    [OperationContract]
    [FaultContract(typeof(ServiceData))]
    ForDataset GetCCDBdata();

    [OperationContract]
    [FaultContract(typeof(ServiceData))]
    string GetCCDBdataasXMLstring();


    //[OperationContract]
    //string GetData(int value);

    //[OperationContract]
    //CompositeType GetDataUsingDataContract(CompositeType composite);

    // TODO: Add your service operations here
}

  [DataContract]
public class ServiceData
{
    [DataMember]
    public bool Result { get; set; }
    [DataMember]
    public string ErrorMessage { get; set; }
    [DataMember]
    public string ErrorDetails { get; set; }
}

nel tuo service1.svc.cs puoi usarlo nel blocco catch:

 catch (Exception ex)
        {
            myServiceData.Result = false;
            myServiceData.ErrorMessage = "unforeseen error occured. Please try later.";
            myServiceData.ErrorDetails = ex.ToString();
            throw new FaultException<ServiceData>(myServiceData, ex.ToString());
        }

E usalo nell'applicazione Client come sotto il codice:

  ConsoleApplicationWCFClient.CCDB_HIG_service.ForDataset ds = obj.GetCCDBdata();

            string str = obj.GetCCDBdataasXMLstring();

        }

        catch (FaultException<ConsoleApplicationWCFClient.CCDB_HIG_service.ServiceData> Fex)
      {
          Console.WriteLine("ErrorMessage::" + Fex.Detail.ErrorMessage + Environment.NewLine);
          Console.WriteLine("ErrorDetails::" + Environment.NewLine + Fex.Detail.ErrorDetails);
          Console.ReadLine();
      }

Prova questo, ti aiuterà sicuramente a ottenere il problema esatto.


4
NON dovresti esporre i dettagli delle eccezioni sottostanti. L'intero scopo della separazione delle eccezioni tra client e server e la necessità di questo flag è di impedire che le informazioni sull'eccezione vengano rese disponibili al client. Un utente malintenzionato potrebbe utilizzare queste informazioni per manipolare il tuo servizio! Se si sta sviluppando, utilizzare il comportamento IncludeExceptionDetailInFaults come descritto per propagare l'intera eccezione o durante la distribuzione, generare un'eccezione faultexception che fornisce un errore molto semplice, come "Impossibile salvare il file" anziché fornire una traccia dello stack e tutti i dettagli del eccezione.
Immortal Blue

Ciao .. nel mio caso tutte le altre funzioni di servizio vengono chiamate dalla funzione che sto usando per salvare il file genera quell'eccezione ... per conoscere il problema esatto che ho usato il sistema di registrazione ma non viene creato alcun registro per quel metodo ... sto creando 3 registri 1) quando il servizio ha colpito 2) prima di salvare qualsiasi file e 3) registro delle eccezioni.
user3217843

0

Come indicato per primo nelle informazioni sull'errore, provare ad aumentare il valore di timeout sia sul lato client che sul lato servizio come segue:

<basicHttpBinding>
    <binding name="basicHttpBinding_ACRMS" maxBufferSize="2147483647"
      maxReceivedMessageSize="2147483647"
      openTimeout="00:20:00" 
      receiveTimeout="00:20:00" closeTimeout="00:20:00"
      sendTimeout="00:20:00">
      <readerQuotas maxDepth="32" maxStringContentLength="2097152"
        maxArrayLength="2097152" maxBytesPerRead="4006" maxNameTableCharCount="16384" />
    </binding>

Quindi non dimenticare di applicare questa configurazione di associazione all'endpoint procedendo come segue:

<endpoint address="" binding="basicHttpBinding" 
      bindingConfiguration="basicHttpBinding_ACRMS"
      contract="MonitorRAM.IService1" />

Se quanto sopra non può aiutarti, sarà meglio se puoi provare a caricare il tuo progetto principale qui, quindi voglio avere un test al mio fianco.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.