Идентификатор ошибки WCF ExceptionShielding не совпадает с обработкойInstanceId, переданной обработчику

У меня есть следующие оформленные на моем сервисе

<ExceptionShielding("MyExceptionPolicyName")>

когда возникает исключение сбоя, моя политика берет ошибку и регистрируется в порядке. Он принимает идентификатор обработкиInstance и записывает его вместе с ошибкой для справки. То, что я замечаю, - это Guid, возвращенный в ошибке "Error ID:", отличается от того, который был передан в обработчик instanceId.

Я также пытался украсить операцию так

<FaultContract(GetType(ValidationFault))>

но это дает те же результаты.

Что бы я хотел сделать, так это то, как захват, который "Идентификатор ошибки:" передается потребителю, поэтому я могу зарегистрировать его вместе с исключением. * Дополнительная информация: обработчик политики исключений является настраиваемым, который принимает исключение, и записывает в него различные свойства и данные в определенную схему журнала исключений.

Кто-нибудь знает, как это сделать?

UPDATE: за комментарий @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>

Затем я выполнил запрос на получение ответа на ошибку, защищенного экранированием исключений. Строка ответа на ошибку форматируется следующим образом:   "Ошибка при использовании этой услуги. Дополнительную информацию можно получить у своего администратора. Идентификатор ошибки: {GUID}"

Затем я просмотрел журнал трассировки и не обнаружил никаких признаков GUID или этой строки.

Вот ссылка pastebin на tracelog для всех, кто хочет увидеть пример одного при использовании ExceptionShielding.

UPDATE2:

Снова, за комментарий @Jay Patel, добавил это. Я попытался использовать значение -1 и max int для maxMessageLog, чтобы гарантировать, что я получаю наибольший объем данных в этом журнале.

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

Журнал не помогает. Он содержит ничего о чем-либо, даже близком к моему вопросу.

Чтобы прояснить, если это неясно выше... Я хочу, чтобы иметь возможность захватить GUID после "Идентификатор ошибки:" в сообщении обратно клиенту, чтобы я мог его зарегистрировать с исключением, которое регистрируется с помощью обработчик исключений. Таким образом, клиенты могут связаться с "Администратором", как говорится в сообщении с идентификатором ошибки, и фактически смогут что-то найти.

Ниже приведена полная трассировка pastbin

Ответ 1

Согласно http://msdn.microsoft.com/en-us/library/ff649012.aspx:

Вы также можете указать источник "{Guid}", чтобы добавить текущий идентификатор экземпляра обработки в свойство "Контракт ошибки".

В вашем файле .config:

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

В вашем ValidationFault FaultContract:

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

Примечание. Источник "{Guid]" является специальным маркером для идентификатора экземпляра обработки.

Смотрите также: http://entlib.codeplex.com/discussions/232049

И, последние 2 записи: http://entlib.codeplex.com/discussions/243558

Ответ 2

будет полезно вести журнал сообщений? Если это так, я думаю, вам нужно что-то подобное в вашем конфиге:

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

Обратите внимание, что исходное имя здесь "System.ServiceModel.MessageLogging", а не "System.ServiceModel".

Полный пример приведен в этой статье: http://msdn.microsoft.com/en-us/library/dd788183.aspx

Надеюсь, это поможет вам.