Activer IncludeExceptionDetailInFaults (soit à partir de ServiceBehaviorAttribute, soit à partir du comportement de configuration) sur le serveur

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

je reçois cette exception:

Système

.ServiceModel.FaultException: le serveur n'a pas pu traiter la requête à cause d'une erreur interne. Pour plus d'informations sur l'erreur, soit activer IncludeExceptionDetailInFaults (soit à partir de ServiceBehaviorAttribute ou à partir du comportement de configuration) sur le serveur en ordre de renvoyer l'information d'exception au client, ou activer le traçage selon la documentation SDK Microsoft.NET Framework 3.0 et inspecter les journaux de trace du serveur.

c'est confus parce que J'exécute .NET 4.0.

Où dois-je mettre IncludeExceptionDetailInFaults ? Je suis battent pour le trouver.

142
demandé sur Otiel 2011-11-29 22:16:58

6 réponses

Définir un comportement dans votre .config fichier:

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

alors appliquez le comportement à votre service le long de ces lignes:

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

vous pouvez également le définir par programmation. Voir cette question .

240
répondu Otiel 2017-05-23 12:10:46

C'est dans l'application.fichier de configuration.

<configuration>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceDebug includeExceptionDetailInFaults="true"/>
57
répondu Rich O'Kelly 2012-09-14 10:09:41

si vous voulez faire ceci par code, vous pouvez ajouter le comportement comme ceci:

serviceHost.Description.Behaviors.Remove(
    typeof(ServiceDebugBehavior));
serviceHost.Description.Behaviors.Add(
    new ServiceDebugBehavior { IncludeExceptionDetailInFaults = true });
38
répondu Yang Zhang 2014-10-29 09:12:09

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'exeption à une version rendue publique, mais pour des raisons de test c'est un outil pratique. Toujours à nouveau désactivé lors de la libération.

22
répondu LievenV 2014-10-10 13:34:41

j'ai aussi eu la même erreur, la WCF fonctionnait correctement pour moi quand je l'utilisais dans L'environnement Dev avec mes références, mais quand quelqu'un d'autre l'utilisait en TEST, il lançait la même erreur. J'ai fait beaucoup de recherches, et puis au lieu de faire des mises à jour de config, j'ai traité une exception dans la méthode WCF avec l'aide de fault exception. En outre, l'identité de la FMC doit être établie avec les mêmes justificatifs d'identité qui ont accès dans la base de données, quelqu'un pourrait avoir changé votre autorité. S'il vous plaît trouver ci-dessous le code pour le même:

 [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 l'utiliser 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 l'utiliser dans l'application Client comme le code 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();
      }

juste essayer ceci, il aidera pour sûr d'obtenir le numéro exact.

4
répondu Aditya 2013-05-08 11:40:36

comme l'information d'erreur dit d'abord s'il vous plaît essayer d'augmenter la valeur de timeout dans le côté client et le 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>

alors n'oubliez pas d'appliquer cette configuration de liaison au point final en faisant ce qui suit:

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

si ce qui précède ne peut pas aider, il sera mieux si vous pouvez essayez de télécharger votre projet principal ici, alors je veux avoir un test de mon côté.

0
répondu Muhammad Mohsin Muneer 2016-02-16 06:06:12