Я начал испытывать ошибки в десериализации WCF сегодня - в коде, который не изменился и работает в течение нескольких месяцев.
Проблема в том, что я получаю runtime XmlException
, говорящий: "Name не может начинаться с" < " персонаж'. Я отлаживался в источнике .NET, и кажется, что ошибка заключается в десериализации возвращаемых объектов из наших вызовов службы WCF. Эти объекты определяются с использованием автоматических свойств, и кажется, что для полей поддержки заданы имена типа <MyProperty>k_BackingField
, откуда исходит XmlException.
Я видел пару других ссылок в Интернете, где люди, принимающие решение, приняли: "Я изменил свой код, чтобы не использовать автоматические свойства", что для меня не очень приемлемо, поскольку у меня было бы 100 объектов для изменения, (с тысячами свойств среди них). Кроме того, этот же код работал нормально, когда я запускал его на прошлой неделе и, похоже, не влиял на все сериализованные DTO, только некоторые.
Чтобы сделать его еще более неприятным, он выглядит слегка прерывистым. Иногда этим утром не было никаких исключений...!
Вопросы
- Почему эта проблема внезапно появилась в неизменном коде и неизменном исходном коде?
- Как исправить это, не изменяя все DTO для использования полностью реализованных свойств?
ОБНОВЛЕНИЕ:. После дня или около того, чтобы нормально работать, эта проблема появилась снова - нет причин, по которым я могу найти, почему она будет работать/не работать/работать снова, но мы здесь.
Я проследил эту проблему дальше, чтобы быть связанным с некоторым кодом, который у меня есть на моем ServiceContracts, используя атрибут ServiceKnownType
, который используется для определения известных типов для сериализации. Кажется, что, хотя типы, сообщаемые с ошибками, даже не являются частью вызова службы, который я делаю в то время, эта ошибка возникает в типах, которые являются частью поведения публикации этого типа.
Проблема возникает, когда я использую некоторый код создания прокси для применения некоторых видов поведения службы;
IOperationBehavior innerBehavior = new PreserveReferencesOperationBehavior(
description, this.preserveReferences, this.maxItemsInObjectGraph);
innerBehavior.ApplyClientBehavior(description, proxy);
Я не могу отлаживать код ApplyClientBehavior
, поскольку он является частью System.ServiceModel
(или может я?), но что-то в этом методе пытается проверить все типы, которые я опубликовал, используя мой атрибут ServiceKnownType
и разбивая некоторые из них с этим XmlException
. У меня нет ИДЕИ, почему некоторые из типов терпят неудачу - и только для некоторых из их свойств.
Это пример типов, которые получают от них ошибки;
[Serializable]
public class MyDataObject
{
public ActivitySession(string id)
{
this.Id = id;
this.IsOpen = true;
}
public string Id { get; set; }
public bool IsValid { get; set; }
}
В исключении указана ошибка в отношении Id
→ <Id>k_BackingField cannot start with '<'
Так что ничего спорно в этом классе, и нет наследования рассмотреть. Это даже не часть контракта на обслуживание, только он был ранее опубликован как известный тип для сериализации.
Теперь это становится довольно эзотерическим, поэтому я не ожидаю ответа, но просто обновляю, где проблема.