Идентификатор ошибки 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
Надеюсь, это поможет вам.