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.

Trevor
fonte

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 .

Otiel
fonte
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"/>
Rich O'Kelly
fonte
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 });
Yang Zhang
fonte
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.

LievenV
fonte
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.

Aditya
fonte
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.

Muhammad Mohsin Muneer
fonte