your programing

WCF ExceptionShielding 오류 ID가 처리기에 전달 된 handlingInstanceId와 일치하지 않습니다.

lovepro 2020. 12. 31. 23:08
반응형

WCF ExceptionShielding 오류 ID가 처리기에 전달 된 handlingInstanceId와 일치하지 않습니다.


내 서비스에 다음 장식이 있습니다.

<ExceptionShielding("MyExceptionPolicyName")>

오류 예외가 발생하면 내 정책이 오류를 선택하고 정상적으로 로그인합니다. handlingInstance Id를 가져와 참조를 위해 오류와 함께 기록합니다. 내가 알아 차린 것은 Fault "Error ID :"에서 반환 된 Guid가 처리 instanceId에 전달 된 Guid와 다르다는 것입니다.

나도 이렇게 수술을 꾸미려고했는데

<FaultContract(GetType(ValidationFault))>

그러나 이것은 동일한 결과를 생성합니다.

제가하고 싶은 것은 "오류 ID :"가 소비자에게 다시 전달되어 예외와 함께 기록 할 수 있도록 캡처하는 방법입니다. * 추가 정보 : 예외 정책 처리기는 예외를 받아들이고 다양한 속성과 데이터를 특정 예외 로그 DB 스키마에 기록하는 사용자 지정 처리기입니다.

누구든지 이것을 수행하는 방법을 알고 있습니까?

업데이트 : @Jay Patel의 의견에 따라 추적을 활성화하기 위해 구성에 이것을 추가했습니다.

<system.diagnostics>
    <sources>
      <source name="System.ServiceModel"
              switchValue="Information, ActivityTracing"
              propagateActivity="true">
        <listeners>
          <add name="traceListener"
              type="System.Diagnostics.XmlWriterTraceListener"
              initializeData= "c:\Temp\Traces.svclog" />
        </listeners>
      </source>
    </sources>
  </system.diagnostics>

그런 다음 예외 보호로 보호되는 오류 응답을 얻기 위해 요청을 실행했습니다. 오류 응답 문자열의 형식은 "이 서비스를 사용하는 동안 오류가 발생했습니다. 자세한 내용은 관리자에게 문의하십시오. 오류 ID : {GUID}"

그런 다음 추적 로그를보고 GUID 또는이 문자열에 대한 증거를 찾지 못했습니다.

다음은 ExceptionShielding을 사용할 때 예제를 보려는 모든 사람을 위해 tracelog에 대한 pastebin 링크입니다.

업데이트 2 :

다시, @Jay Patel의 의견에 따라 이것을 추가했습니다. 해당 로그에서 가장 많은 양의 데이터를 얻고 있는지 확인하기 위해 maxMessageLog에 대해 -1 및 max int 값을 시도했습니다.

<diagnostics>
  <messageLogging logEntireMessage="true" logMalformedMessages="true" logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="true" maxMessagesToLog="2147483647" />
</diagnostics>

로그는 도움이되지 않습니다. 내 질문에 대한 답변에 가까운 것도 포함 하지 않습니다 .

위에서 명확하지 않은 경우 명확히 하기 위해 ... 메시지에서 "오류 ID :"뒤에 GUID를 캡처하여 클라이언트에 다시 보내 예외 처리기에 의해 기록 된 예외와 함께 기록 할 수 있기를 원합니다. 이런 식으로 클라이언트는 오류 ID와 함께 메시지가 말하는 것처럼 "관리자"에게 연락하여 실제로 무언가를 찾을 수 있습니다.

다음은 전체 추적이 활성화 된 pastbin입니다.


http://msdn.microsoft.com/en-us/library/ff649012.aspx 에 따르면 :

또한 "{Guid}"소스를 지정하여 현재 처리 인스턴스 ID를 Fault Contract 속성에 추가 할 수 있습니다.

.config 파일에서 :

<mappings>
    <add source="{Guid}" name="HandlingInstanceId" />
</mappings>

ValidationFault FaultContract에서 :

[DataMember]
public Guid HandlingInstanceId { get; set; }

참고 : "{Guid}"소스는 처리 인스턴스 ID의 특수 마커로 나타납니다.

참조 : http://entlib.codeplex.com/discussions/232049

그리고 마지막 2 개 항목 : http://entlib.codeplex.com/discussions/243558


메시지 로깅이 도움이 될까요? 그렇다면 구성에 다음과 같은 것이 필요하다고 생각합니다.

<source name ="System.ServiceModel.MessageLogging" 
      switchValue="Verbose, ActivityTracing">        
<listeners>
  <add name="xml" />
</listeners>

여기서 소스 이름은 'System.ServiceModel'이 아니라 'System.ServiceModel.MessageLogging'입니다.

전체 예제는 다음 문서를 참조하십시오. http://msdn.microsoft.com/en-us/library/dd788183.aspx

이것이 당신을 도울 것입니다.

참조 URL : https://stackoverflow.com/questions/15913197/wcf-exceptionshielding-error-id-does-not-match-up-with-handlinginstanceid-passed

반응형