Ative o IncludeExceptionDetailInFaults (no ServiceBehaviorAttribute ou no comportamento de configuração <serviceDebug>) no servidor


157

Eu tenho um serviço WCF que está funcionando perfeitamente e algo mudou e não sei o quê.

Eu recebo esta exceção:

System.ServiceModel.FaultException: O servidor não pôde processar a solicitação devido a um erro interno. Para obter mais informações sobre o erro, ative IncludeExceptionDetailInFaults (no ServiceBehaviorAttribute ou no comportamento de configuração) no servidor para enviar as informações de exceção de volta ao cliente ou ative o rastreamento conforme a documentação do Microsoft .NET Framework 3.0 SDK e inspecione os logs de rastreamento do servidor.

Isso é confuso porque estou executando o .NET 4.0.

Onde eu ligo IncludeExceptionDetailInFaults? Estou lutando para encontrá-lo.

Respostas:


264

Defina um comportamento no seu .configarquivo:

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

Em seguida, aplique o comportamento ao seu serviço ao longo destas linhas:

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

Você também pode configurá-lo programaticamente. Veja esta pergunta .


1
Oi Otivel, no meu caso, existem pastas aninhadas contendo diferentes sites e serviços. A pasta em que meu serviço reside e estou recebendo erro está no terceiro grau de aninhamento em relação ao aplicativo Web principal e tenho web.config dedicado para cada serviço. Altero meu web.config correspondente para adicionar <serviceDebug includeExceptionDetailInFaults = "true" />. Mas ainda estou recebendo o erro. Preciso alterar todo o web.config no aplicativo Web completo?
MAXRECURSION

2
@AkshayKulkarni: Não tenho certeza, não tenho experiência com o seu caso. Certifique-se de que seus serviços tenham uma referência ao serviceBehavior (verifique a resposta do gagogra ) primeiro. Se isso não resolver o problema, faça uma pergunta no SO.
Otiel

1
@MatthewLock: Resposta atualizada. Além disso, verifique <comportamento> e <serviço> se precisar de mais detalhes.
263 Otiel

1
O Visual Studio me diz que serviceBehaviors não pode ser um filho direto de system.serviceModel. Acabou indo com a resposta de rich.okelly.
andrewb

3
Nota: O VS2013 coloca a tag <serviceDebug> no Web.config padrão com ela definida como false. Se você não perceber como eu não fiz e adicionar o XML acima, aparentemente o que está por último no arquivo vence. Espero que isso seja útil para alguém por aí.
Jeff Jeff

63

Está no arquivo app.config.

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

9
Não defina o atributo name de <behavior> (como na resposta @Otiel) se desejar que ele se aplique a todos os seus serviços.
Pashec

47

Se você quiser fazer isso por código, poderá adicionar o comportamento da seguinte maneira:

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

Adicione isso à sua ServiceHostinstância do objeto: Exemplo:ServiceHost serviceHost = new ServiceHost(Program.serviceInstance);
Daniel Bonetti 21/03

28

Você também pode configurá-lo na tag [ServiceBehavior] acima da sua declaração de classe que herda a interface

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

O Immortal Blue está correto em não divulgar os detalhes da exceção para uma versão lançada publicamente, mas para fins de teste, essa é uma ferramenta útil. Sempre desligue ao liberar.


Eu usei isso em um aplicativo que é executado no backend e nunca será visível publicamente, então isso funciona perfeitamente
AlbatrossCafe

4

Eu também estava recebendo o mesmo erro, o WCF estava funcionando corretamente para mim quando eu o estava usando no ambiente de desenvolvimento com minhas credenciais, mas quando alguém o estava usando no TEST, estava lançando o mesmo erro. Pesquisei bastante e, em vez de fazer atualizações de configuração, lidei com uma exceção no método WCF com a ajuda da exceção de falha. Além disso, a identidade do WCF precisa ser definida com as mesmas credenciais que estão tendo acesso ao banco de dados; alguém pode ter alterado sua autoridade. Encontre abaixo o código para o mesmo:

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

em seu service1.svc.cs, você pode usá-lo no bloco 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 use isso no aplicativo cliente, como no código abaixo:

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

Basta tentar isso, ajudará a obter o problema exato.


4
Você NÃO deve expor os detalhes da exceção subjacente. Todo o objetivo da separação de exceções entre cliente e servidor e a necessidade desse sinalizador é impedir que as informações de exceção sejam disponibilizadas ao cliente. Um usuário mal-intencionado pode usar essas informações para manipular seu serviço! Se você estiver desenvolvendo, use o comportamento IncludeExceptionDetailInFaults, conforme descrito para propagar toda a exceção ou, na implantação, crie uma exceção de erro, fornecendo um erro muito básico, como "Não é possível salvar o arquivo" em vez de fornecer um rastreamento de pilha e detalhes completos do exceção.
Blue Imortal

Oi .. no meu caso, todas as outras funções de serviço estão sendo chamadas pela função que estou usando para salvar o arquivo está lançando essa exceção ... para saber o problema exato que usei o sistema de log, mas nenhum log é criado para esse método ... estou criando 3 logs 1) quando o serviço pressionou 2) antes de salvar qualquer arquivo e 3) log de exceção.
user3217843

0

Como as informações de erro disseram primeiro, tente aumentar o valor do tempo limite no lado do cliente e no serviço da seguinte maneira:

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

Então, não se esqueça de aplicar essa configuração de ligação ao terminal, fazendo o seguinte:

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

Se o que precede não puder ajudar, será melhor se você tentar fazer upload do seu projeto principal aqui, então quero fazer um teste ao meu lado.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.