Как добавить тип SqlException для настраиваемого участника отслеживания? - PullRequest
0 голосов
/ 04 марта 2011

В процессе отслеживания рабочего процесса я получаю следующие (периодические) ошибки:

"Ошибка произошла во время вызов слежения за участниками, вызывающий экземпляр должен быть прерван. Увидеть внутреннее исключение для более подробной информации. InnerException Сообщение: Тип 'System.Data.SqlClient.SqlException' с названием контракта данных «SqlException: http://schemas.datacontract.org/2004/07/System.Data.SqlClient' не ожидается Рассмотрите возможность использования DataContractResolver или добавить любые типы статически не известен в списке известные типы - например, с помощью атрибут KnownTypeAttribute или добавив их в список известных типов перешел к DataContractSerializer. "

Мой пользовательский участник отслеживания выглядит примерно так:

            protected override void Track (TrackingRecord record, TimeSpan timeout)
            {

              StringWriter sw = null;
              if (record == null) throw new ArgumentNullException("record");
              if (timeout == null) throw new ArgumentNullException("timeout");
              StringBuilder sb = new StringBuilder();
              sw = new StringWriter(sb);

              using (XmlTextWriter writer = new XmlTextWriter(sw) { Formatting = Formatting.Indented })
              {
                  DataContractSerializer serializer = new DataContractSerializer(record.GetType());
                  serializer.WriteObject(writer, record);
                  writer.Flush();
                  writer.Close();
              }


              _logger.Log(sb.ToString());
            }

Как мне решить эту проблему?

Кроме того, есть ли какие-либо другие типы, которые рабочий процесс мог бы бросить в меня, которые я еще не видел, но должен обработать в моем участнике отслеживания?

1 Ответ

2 голосов
/ 08 марта 2011

Нашел решение здесь: http://blogs.msdn.com/b/youssefm/archive/2009/06/05/introducing-a-new-datacontractserializer-feature-the-datacontractresolver.aspx

Создать пользовательский DCR:

public class SharedTypeResolver : DataContractResolver
{
    public override bool TryResolveType(Type dataContractType, Type declaredType, DataContractResolver knownTypeResolver, out XmlDictionaryString typeName, out XmlDictionaryString typeNamespace)
    {    
        if (!knownTypeResolver.TryResolveType(dataContractType, declaredType, null, out typeName, out typeNamespace))
        {
            XmlDictionary dictionary = new XmlDictionary();
            typeName = dictionary.Add(dataContractType.FullName);
            typeNamespace = dictionary.Add(dataContractType.Assembly.FullName);
        }
        return true;
    }


    public override Type ResolveName(string typeName, string typeNamespace, Type declaredType, DataContractResolver knownTypeResolver)
    {
        return knownTypeResolver.ResolveName(typeName, typeNamespace, declaredType, null) ?? Type.GetType(typeName + ", " + typeNamespace);
    }
}

Изменить строку DCS в моем коде:

DataContractSerializer serializer = new DataContractSerializer(record.GetType(), null, Int32.MaxValue, false, false, null, new SharedTypeResolver()

Работа выполнена.

...