Aktivieren Sie IncludeExceptionDetailInFaults (entweder über ServiceBehaviorAttribute oder über das Konfigurationsverhalten von <serviceDebug>) auf dem Server


157

Ich habe einen WCF-Dienst, der perfekt funktioniert hat, und etwas hat sich geändert, und ich weiß nicht, was.

Ich bekomme diese Ausnahme:

System.ServiceModel.FaultException: Der Server konnte die Anforderung aufgrund eines internen Fehlers nicht verarbeiten. Für weitere Informationen zum Fehler aktivieren Sie entweder IncludeExceptionDetailInFaults (entweder von ServiceBehaviorAttribute oder vom Konfigurationsverhalten) auf dem Server, um die Ausnahmeinformationen an den Client zurückzusenden, oder aktivieren Sie die Ablaufverfolgung gemäß der Microsoft .NET Framework 3.0 SDK-Dokumentation und überprüfen Sie die Server-Trace-Protokolle.

Dies ist verwirrend, da ich .NET 4.0 verwende.

Wo schalte ich ein IncludeExceptionDetailInFaults? Ich kämpfe darum, es zu finden.

Antworten:


264

Definieren Sie ein Verhalten in Ihrer .configDatei:

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

Wenden Sie dann das Verhalten auf Ihren Dienst folgendermaßen an:

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

Sie können es auch programmgesteuert einstellen. Siehe diese Frage .


1
Hallo Otivel, in meinem Fall gibt es verschachtelte Ordner mit verschiedenen Websites und Diensten. Der Ordner, in dem sich mein Dienst befindet und bei dem eine Fehlermeldung angezeigt wird, befindet sich im dritten Verschachtelungsgrad in Bezug auf die Hauptwebanwendung, und ich habe für jeden Dienst eine dedizierte web.config. Ich ändere meine entsprechende web.config entsprechend, um <serviceDebug includeExceptionDetailInFaults = "true" /> hinzuzufügen. Aber ich bekomme immer noch den Fehler. Muss ich die gesamte web.config in einer vollständigen Webanwendung ändern?
MaxRecursion

2
@AkshayKulkarni: Nicht sicher, ich habe keine Erfahrung mit Ihrem Fall. Stellen Sie sicher, dass Ihre Dienste zuerst einen Verweis auf das serviceBehavior haben (überprüfen Sie die Gagogra- Antwort). Wenn das Problem dadurch nicht gelöst wird, stellen Sie bitte eine Frage zu SO.
Otiel

1
@MatthewLock: Aktualisierte Antwort. Überprüfen Sie auch <Verhalten> und <Service>, wenn Sie weitere Details benötigen.
Otiel

1
Visual Studio sagt mir, dass serviceBehaviors kein direktes untergeordnetes Element von system.serviceModel sein kann. Am Ende ging es mit der Antwort von rich.okelly weiter.
Andrewb

3
Hinweis: VS2013 fügt das <serviceDebug> -Tag in die Standard-Web.config ein und setzt es auf false. Wenn Sie nicht bemerken, wie ich es nicht getan habe, und das obige XML anscheinend hinzufügen, gewinnt das, was zuletzt in der Datei enthalten ist. Hoffe, das ist nützlich für jemanden da draußen.
Jeff

63

Es befindet sich in der Datei app.config.

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

9
Legen Sie das Namensattribut <Verhalten> nicht fest (wie in der Antwort von @Otiel), wenn Sie möchten, dass es auf alle Ihre Dienste angewendet wird.
Pashec

47

Wenn Sie dies per Code tun möchten, können Sie das folgende Verhalten hinzufügen:

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

Fügen Sie dies Ihrer ServiceHostObjektinstanz hinzu: Beispiel:ServiceHost serviceHost = new ServiceHost(Program.serviceInstance);
Daniel Bonetti

28

Sie können es auch im Tag [ServiceBehavior] über Ihrer Klassendeklaration festlegen, die die Schnittstelle erbt

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

Immortal Blue gibt die Ausnahmedetails zu Recht nicht an eine öffentlich veröffentlichte Version weiter, aber zu Testzwecken ist dies ein praktisches Tool. Beim Loslassen immer wieder ausschalten.


Ich habe dies in einer Anwendung verwendet, die im Backend ausgeführt wird und niemals öffentlich sichtbar sein wird, daher funktioniert dies perfekt
AlbatrossCafe

4

Ich habe auch den gleichen Fehler erhalten, die WCF funktionierte ordnungsgemäß für mich, als ich sie in der Entwicklungsumgebung mit meinen Anmeldeinformationen verwendete, aber als jemand anderes sie in TEST verwendete, gab sie den gleichen Fehler aus. Ich habe viel recherchiert und dann statt Konfigurationsaktualisierungen eine Ausnahme in der WCF-Methode mit Hilfe einer Fehlerausnahme behandelt. Außerdem muss die Identität für die WCF mit denselben Anmeldeinformationen festgelegt werden, die Zugriff auf die Datenbank haben. Möglicherweise hat jemand Ihre Berechtigung geändert. Nachfolgend finden Sie den Code für dasselbe:

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

In Ihrer service1.svc.cs können Sie dies im catch-Block verwenden:

 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());
        }

Und verwenden Sie dies in der Client-Anwendung wie folgt:

  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();
      }

Versuchen Sie dies einfach, es wird sicher helfen, das genaue Problem zu bekommen.


4
Sie sollten die zugrunde liegenden Ausnahmedetails NICHT offenlegen. Der gesamte Zweck für die Trennung von Ausnahmen zwischen Client und Server und die Notwendigkeit dieses Flags besteht darin, zu verhindern, dass Ausnahmeinformationen dem Client zur Verfügung gestellt werden. Ein böswilliger Benutzer könnte diese Informationen verwenden, um Ihren Dienst zu manipulieren! Verwenden Sie beim Entwickeln das beschriebene Verhalten IncludeExceptionDetailInFaults, um die gesamte Ausnahme zu verbreiten, oder lösen Sie bei der Bereitstellung eine Fehlerausnahme aus, die einen sehr grundlegenden Fehler wie "Datei kann nicht gespeichert werden" ausgibt, anstatt einen Stack-Trace und alle Details des Ausnahme.
Immortal Blue

Hallo .. in meinem Fall werden alle anderen Servicefunktionen von der Funktion aufgerufen, die ich zum Speichern der Datei verwende, um diese Ausnahme auszulösen ... um das genaue Problem zu kennen, das ich beim Protokollierungssystem verwendet habe, aber für diese Methode wird kein Protokoll erstellt ... Ich erstelle 3 Protokolle 1) wenn der Dienst 2) vor dem Speichern einer Datei und 3) Ausnahmeprotokoll traf.
user3217843

0

Wie in den Fehlerinformationen zuerst angegeben, versuchen Sie bitte, den Timeout-Wert sowohl auf der Client- als auch auf der Serviceseite wie folgt zu erhöhen:

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

Vergessen Sie dann nicht, diese Bindungskonfiguration wie folgt auf den Endpunkt anzuwenden:

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

Wenn das oben genannte nicht helfen kann, ist es besser, wenn Sie versuchen können, Ihr Hauptprojekt hier hochzuladen, dann möchte ich einen Test an meiner Seite haben.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.