web-dev-qa-db-fra.com

Activer IncludeExceptionDetailInFaults (à partir du comportement ServiceBehaviorAttribute ou du comportement de configuration <serviceDebug>) sur le serveur.

J'ai un service WCF qui fonctionne parfaitement et quelque chose a changé et je ne sais pas quoi.

Je reçois cette exception:

System.ServiceModel.FaultException: le serveur n'a pas pu traiter la demande en raison d'une erreur interne. Pour plus d'informations sur l'erreur, activez IncludeExceptionDetailInFaults (à partir de ServiceBehaviorAttribute ou du comportement de configuration) sur le serveur afin de renvoyer les informations sur l'exception au client ou activez le traçage selon la documentation du Kit de développement Microsoft .NET Framework 3.0. et inspectez les journaux de trace du serveur.

C'est déroutant car j'utilise .NET 4.0.

Où puis-je activer IncludeExceptionDetailInFaults? Je me bats pour le trouver.

153
Trevor

Définissez un comportement dans votre fichier .config:

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

Appliquez ensuite le comportement à votre service selon ces lignes:

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

Vous pouvez également le définir par programme. Voir cette question .

255
Otiel

C'est dans le fichier app.config.

<configuration>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceDebug includeExceptionDetailInFaults="true"/>
61
Rich O'Kelly

Si vous voulez le faire par code, vous pouvez ajouter le comportement suivant:

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

Vous pouvez également le définir dans la balise [ServiceBehavior] au-dessus de votre déclaration de classe qui hérite de l'interface.

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

Immortal Blue a raison de ne pas divulguer les détails de l'exception à une version publiée, mais à des fins de test, il s'agit d'un outil pratique. Toujours éteindre lors de la libération.

24
LievenV

J'avais également la même erreur, la WCF fonctionnait correctement pour moi lorsque je l'utilisais dans l'environnement de développement avec mes informations d'identification, mais lorsque quelqu'un d'autre l'utilisait dans TEST, la même erreur était renvoyée. J'ai fait beaucoup de recherches, puis au lieu de faire des mises à jour de configuration, j'ai traité une exception dans la méthode WCF à l'aide d'une exception de faute. De plus, l'identité de la WCF doit être définie avec les mêmes informations d'identification que celles ayant accès à la base de données. Une personne peut avoir changé votre autorité. Veuillez trouver ci-dessous le code correspondant:

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

dans votre service1.svc.cs, vous pouvez utiliser ceci dans le bloc 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());
        }

Et utilisez ceci dans l’application Client comme ci-dessous:

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

Essayez ceci, cela vous aidera à obtenir le problème exact.

4
Aditya

Comme les informations d'erreur l'ont indiqué en premier, veuillez essayer d'augmenter la valeur du délai d'attente du côté client et du côté service, comme suit:

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

Ensuite, n'oubliez pas d'appliquer cette configuration de liaison au noeud final en procédant comme suit:

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

Si ce qui précède ne peut vous aider, il sera préférable d’essayer de télécharger votre projet principal ici, alors je veux avoir un test à mes côtés.

0