서버에서 IncludeExceptionDetailInFaults (ServiceBehaviorAttribute 또는 <serviceDebug> 구성 동작)를 설정하십시오.


157

나는 완벽하게 작동하는 WCF 서비스를 가지고 있으며 무언가가 바뀌었고 무엇을 알지 못합니다.

이 예외가 발생합니다.

System.ServiceModel.FaultException : 서버가 내부 오류로 인해 요청을 처리 할 수 ​​없습니다. 오류에 대한 자세한 내용을 보려면 서버에서 IncludeExceptionDetailInFaults (ServiceBehaviorAttribute 또는 구성 동작)를 설정하여 예외 정보를 다시 클라이언트로 보내거나 Microsoft .NET Framework 3.0 SDK 설명서에 따라 추적을 설정하십시오. 서버 추적 로그를 검사하십시오.

.NET 4.0을 실행하고 있기 때문에 혼란 스럽습니다.

어디서 켤 IncludeExceptionDetailInFaults까요? 나는 그것을 찾기 위해 싸우고있다.

답변:


265

파일 에서 동작 을 정의하십시오 .config.

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

그런 다음 다음 행을 따라 서비스에 동작을 적용하십시오.

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

프로그래밍 방식으로 설정할 수도 있습니다. 이 질문을 참조하십시오 .


1
안녕하세요, 제 경우에는 다른 사이트와 서비스를 포함하는 중첩 폴더가 있습니다. 내 서비스가 상주하고 오류가 발생하는 폴더는 기본 웹 응용 프로그램과 관련하여 세 번째 수준의 중첩이며 각 서비스마다 전용 web.config가 있습니다. <serviceDebug includeExceptionDetailInFaults = "true"/>를 추가하기 위해 해당 web.config를 적절하게 변경합니다. 그러나 여전히 오류가 발생합니다. 완전한 웹 응용 프로그램에서 모든 web.config를 변경해야합니까?
MaxRecursion

2
@ AkshayKulkarni : 확실하지 않습니다, 나는 당신의 경우에 경험이 없습니다. 서비스에 serviceBehavior ( 가고 그라 응답 확인)에 대한 참조가 있는지 확인하십시오 . 그래도 문제가 해결되지 않으면 SO에 질문하십시오.
Otiel

1
@ MatthewLock : 답변을 업데이트했습니다. 또한 자세한 내용이 필요한 경우 <동작><서비스>를 확인하십시오.
Otiel

1
Visual Studio는 serviceBehaviors가 system.serviceModel의 직접적인 자식이 될 수 없다고 말합니다. rich.okelly의 대답으로 끝났습니다.
andrewb

3
참고 : VS2013은 <serviceDebug> 태그를 기본 Web.config에 false로 설정하여 넣습니다. 내가하지 않은 것처럼 눈에 띄지 않으면 위의 XML을 분명히 추가하십시오. 파일의 마지막 항목이 승리합니다. 이것이 누군가에게 유용하기를 바랍니다.
Jeff

63

app.config 파일에 있습니다.

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

9
모든 서비스에 적용하려면 <behavior>의 이름 속성을 @Otiel 답변에서와 같이 설정하지 마십시오.
Pashec

47

코드로이 작업을 수행하려면 다음과 같은 동작을 추가하십시오.

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

이것을 ServiceHost객체 인스턴스에 추가하십시오 . 예 :ServiceHost serviceHost = new ServiceHost(Program.serviceInstance);
Daniel Bonetti

28

인터페이스를 상속하는 클래스 선언 위의 [ServiceBehavior] 태그에서 설정할 수도 있습니다.

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

Immortal Blue는 실행 세부 사항을 공개적으로 출시 된 버전에 공개하지 않는 것이 맞지만 테스트 목적으로 편리한 도구입니다. 손을 떼면 항상 전원을 끄십시오.


백엔드에서 실행되며 공개적으로 볼 수없는 응용 프로그램에서이 기능을 사용 했으므로 완벽하게 작동합니다.
AlbatrossCafe

4

또한 동일한 오류가 발생했습니다. 개발 환경에서 자격 증명으로 WCF를 사용할 때 WCF가 제대로 작동했지만 다른 사람이 테스트에서 사용하면 동일한 오류가 발생했습니다. 나는 많은 연구를 한 다음 구성 업데이트를 수행하는 대신 결함 예외를 사용하여 WCF 방법에서 예외를 처리했습니다. 또한 WCF의 ID는 데이터베이스에서 액세스 할 수있는 동일한 자격 증명으로 설정해야합니다. 누군가 권한을 변경했을 수 있습니다. 동일한 코드 아래에서 찾으십시오.

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

service1.svc.cs에서 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());
        }

아래 코드와 같이 클라이언트 응용 프로그램에서 이것을 사용하십시오.

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

이것을 시도하면 정확한 문제를 얻는 데 도움이됩니다.


4
기본 예외 세부 사항을 노출해서는 안됩니다. 클라이언트와 서버 간의 예외 분리와이 플래그의 필요성에 대한 전체 목적은 클라이언트가 예외 정보를 사용할 수 없도록하는 것입니다. 악의적 인 사용자가이 정보를 사용하여 서비스를 조작 할 수 있습니다! 개발중인 경우 전체 예외를 전파하거나 배치시 설명 된대로 IncludeExceptionDetailInFaults 동작을 사용하여 스택 추적 및 전체 세부 사항을 제공하는 대신 "파일을 저장할 수 없음"과 같은 매우 기본적인 오류를 제공하는 결함 예외를 발생시킵니다. 예외.
Immortal Blue

안녕 .. 내 경우에는 다른 모든 서비스 함수가 ​​파일을 저장하는 데 사용하는 함수가 예외를 던지고 있습니다 ... 로깅 시스템을 사용한 정확한 문제를 알고 있지만 해당 메소드에 대해 로그가 생성되지 않습니다 ... 1) 서비스가 2) 파일을 저장하기 전에 3) 예외 로그를 ​​쳤을 때 3 개의 로그를 만듭니다.
user3217843

0

오류 정보가 먼저 말했듯이 클라이언트 측과 서비스 측 모두에서 다음과 같이 시간 초과 값을 늘리십시오.

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

그런 다음 다음을 수행하여이 바인딩 구성을 엔드 포인트에 적용하는 것을 잊지 마십시오.

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

위의 방법으로 도움이되지 않으면 여기에 기본 프로젝트를 업로드하려고하면 더 좋을 것입니다. 내 테스트를하고 싶습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.