Справочник службы WCF - Получение «XmlException: имя не может начинаться с символа« <», шестнадцатеричное значение 0x3C» на стороне клиента - PullRequest
24 голосов
/ 06 августа 2011

У меня есть интеллектуальное клиентское приложение, которое связывается со своим сервером через WCF.Данные создаются на клиенте, а затем отправляются через службу для сохранения.Сервер и клиент используют одни и те же классы домена через общую библиотеку DLL, и я использую удобную функцию «Добавить ссылку на службу» в Visual Studio, которая упаковывает SvcUtil.exe и генерирует классы клиента и прокси.

Я получаюследующая ошибка при попытке вызвать службу:

System.Xml.XmlException occurred
  Message=Name cannot begin with the '<' character, hexadecimal value 0x3C.
  Source=System.Xml
  LineNumber=0
  LinePosition=1
  StackTrace:
       at System.Xml.XmlConvert.VerifyNCName(String name, ExceptionType exceptionType)
  InnerException: 

Это особенно неприятно, поскольку служба будет работать неделями без возникновения этой ошибки, а затем внезапно и без предупреждения она появится снова.Я не был в состоянии понять, что вызывает это вообще.Когда это произойдет, я углублюсь в изучение того, как это исправить, и обычно не придумываю ничего, кроме людей, которые столкнулись с той же ошибкой, пытаясь на самом деле сериализовать вещи в XML программно.Я использую только сгенерированный клиент и прокси, чтобы попытаться отправить эти данные.

Я посмотрел на сгенерированные прокси в папке Service References\AwesomeService моего решения и не вижу ничего, что выглядит необычно.Единственные вхождения угловых скобок в сгенерированных файлах:

  • xml-теги в файлах * .svcinfo, Reference.svcmap, AwesomeService.disco, AwesomeService.wsdl и * .xsd
  • аргументы к общим коллекциям в файле Reference.cs

Код, который я использую для вызова службы, таков:

using (var client = new AwesomeServiceClient())
{
    client.SaveAwesomeness(instanceOfAwesomeness);
}

Это стек, начинающийся с первогов кадре над кодом вызова, указанным выше:

System.Xml.dll!System.Xml.XmlConvert.VerifyNCName(string name, System.Xml.ExceptionType exceptionType) + 0xb5 bytes 
System.Runtime.Serialization.dll!System.Runtime.Serialization.DataContract.IsValidNCName(string name) + 0x27 bytes  
System.Runtime.Serialization.dll!System.Runtime.Serialization.DataContract.EncodeLocalName(string localName) + 0x1d bytes   
System.Runtime.Serialization.dll!System.Runtime.Serialization.ClassDataContract.ClassDataContractCriticalHelper.ImportDataMembers() + 0x2e1 bytes   
System.Runtime.Serialization.dll!System.Runtime.Serialization.ClassDataContract.ClassDataContractCriticalHelper.ClassDataContractCriticalHelper(System.Type type) + 0x10d bytes 
System.Runtime.Serialization.dll!System.Runtime.Serialization.DataContract.DataContractCriticalHelper.CreateDataContract(int id, System.RuntimeTypeHandle typeHandle, System.Type type) + 0x198 bytes   
System.Runtime.Serialization.dll!System.Runtime.Serialization.DataContract.DataContractCriticalHelper.GetDataContractSkipValidation(int id, System.RuntimeTypeHandle typeHandle, System.Type type) + 0x57 bytes 
System.Runtime.Serialization.dll!System.Runtime.Serialization.XmlObjectSerializerContext.GetDataContract(int id, System.RuntimeTypeHandle typeHandle) + 0x37 bytes  
System.Runtime.Serialization.dll!System.Runtime.Serialization.XmlObjectSerializerWriteContext.InternalSerialize(System.Runtime.Serialization.XmlWriterDelegator xmlWriter, object obj, bool isDeclaredType, bool writeXsiType, int declaredTypeID, System.RuntimeTypeHandle declaredTypeHandle) + 0x49 bytes    
[Lightweight Function]  
System.Runtime.Serialization.dll!System.Runtime.Serialization.ClassDataContract.WriteXmlValue(System.Runtime.Serialization.XmlWriterDelegator xmlWriter, object obj, System.Runtime.Serialization.XmlObjectSerializerWriteContext context) + 0x25 bytes 
System.Runtime.Serialization.dll!System.Runtime.Serialization.XmlObjectSerializerWriteContext.WriteDataContractValue(System.Runtime.Serialization.DataContract dataContract, System.Runtime.Serialization.XmlWriterDelegator xmlWriter, object obj, System.RuntimeTypeHandle declaredTypeHandle) + 0x18 bytes   
System.Runtime.Serialization.dll!System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeWithoutXsiType(System.Runtime.Serialization.DataContract dataContract, System.Runtime.Serialization.XmlWriterDelegator xmlWriter, object obj, System.RuntimeTypeHandle declaredTypeHandle) + 0x49 bytes  
System.Runtime.Serialization.dll!System.Runtime.Serialization.DataContractSerializer.InternalWriteObjectContent(System.Runtime.Serialization.XmlWriterDelegator writer, object graph, System.Runtime.Serialization.DataContractResolver dataContractResolver) + 0xdf bytes  
System.Runtime.Serialization.dll!System.Runtime.Serialization.DataContractSerializer.InternalWriteObject(System.Runtime.Serialization.XmlWriterDelegator writer, object graph, System.Runtime.Serialization.DataContractResolver dataContractResolver) + 0x26 bytes 
System.Runtime.Serialization.dll!System.Runtime.Serialization.XmlObjectSerializer.WriteObjectHandleExceptions(System.Runtime.Serialization.XmlWriterDelegator writer, object graph, System.Runtime.Serialization.DataContractResolver dataContractResolver) + 0x60 bytes    
System.Runtime.Serialization.dll!System.Runtime.Serialization.XmlObjectSerializer.WriteObject(System.Xml.XmlDictionaryWriter writer, object graph) + 0x2d bytes 
System.ServiceModel.dll!System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.SerializeParameterPart(System.Xml.XmlDictionaryWriter writer, System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.PartInfo part, object graph) + 0x38 bytes 
System.ServiceModel.dll!System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.SerializeParameter(System.Xml.XmlDictionaryWriter writer, System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.PartInfo part, object graph) + 0xbe bytes 
System.ServiceModel.dll!System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.SerializeParameters(System.Xml.XmlDictionaryWriter writer, System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.PartInfo[] parts, object[] parameters) + 0x3e bytes  
System.ServiceModel.dll!System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.SerializeBody(System.Xml.XmlDictionaryWriter writer, System.ServiceModel.Channels.MessageVersion version, string action, System.ServiceModel.Description.MessageDescription messageDescription, object returnValue, object[] parameters, bool isRequest) + 0x68 bytes   
System.ServiceModel.dll!System.ServiceModel.Dispatcher.OperationFormatter.SerializeBodyContents(System.Xml.XmlDictionaryWriter writer, System.ServiceModel.Channels.MessageVersion version, object[] parameters, object returnValue, bool isRequest) + 0x7b bytes   
System.ServiceModel.dll!System.ServiceModel.Dispatcher.OperationFormatter.OperationFormatterMessage.OperationFormatterBodyWriter.OnWriteBodyContents(System.Xml.XmlDictionaryWriter writer) + 0x4f bytes    
System.ServiceModel.dll!System.ServiceModel.Channels.BodyWriter.WriteBodyContents(System.Xml.XmlDictionaryWriter writer) + 0xf8 bytes   
System.ServiceModel.dll!System.ServiceModel.Channels.BodyWriterMessage.OnBodyToString(System.Xml.XmlDictionaryWriter writer) + 0x1f bytes   
System.ServiceModel.dll!System.ServiceModel.Channels.Message.ToString(System.Xml.XmlDictionaryWriter writer) + 0xaa bytes   
System.ServiceModel.dll!System.ServiceModel.Diagnostics.MessageLogTraceRecord.WriteTo(System.Xml.XmlWriter writer) + 0x166 bytes    
System.ServiceModel.dll!System.ServiceModel.Diagnostics.MessageLogger.LogInternal(System.ServiceModel.Diagnostics.MessageLogTraceRecord record) + 0x77 bytes    
System.ServiceModel.dll!System.ServiceModel.Diagnostics.MessageLogger.LogMessageImpl(ref System.ServiceModel.Channels.Message message, System.Xml.XmlReader reader, System.ServiceModel.Diagnostics.MessageLoggingSource source) + 0x104 bytes  
System.ServiceModel.dll!System.ServiceModel.Diagnostics.MessageLogger.LogMessage(ref System.ServiceModel.Channels.Message message, System.Xml.XmlReader reader, System.ServiceModel.Diagnostics.MessageLoggingSource source) + 0x3a bytes   
System.ServiceModel.dll!System.ServiceModel.Channels.ServiceChannel.PrepareCall(System.ServiceModel.Dispatcher.ProxyOperationRuntime operation, bool oneway, ref System.ServiceModel.Dispatcher.ProxyRpc rpc) + 0x436 bytes 
System.ServiceModel.dll!System.ServiceModel.Channels.ServiceChannel.Call(string action, bool oneway, System.ServiceModel.Dispatcher.ProxyOperationRuntime operation, object[] ins, object[] outs, System.TimeSpan timeout) + 0x12b bytes    
System.ServiceModel.dll!System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(System.Runtime.Remoting.Messaging.IMethodCallMessage methodCall, System.ServiceModel.Dispatcher.ProxyOperationRuntime operation) + 0x64 bytes    
System.ServiceModel.dll!System.ServiceModel.Channels.ServiceChannelProxy.Invoke(System.Runtime.Remoting.Messaging.IMessage message) + 0x6a bytes    
mscorlib.dll!System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(ref System.Runtime.Remoting.Proxies.MessageData msgData, int type) + 0xee bytes

Что является причиной этого и как его предотвратить?Или, также приветствуется, как я могу продолжить устранение неполадок?

Ответы [ 6 ]

16 голосов
/ 08 августа 2011

Посмотрите на свои DataTables (если это то, что вы используете для передачи данных).

Если имя DataTable пустое, Serializer может запутаться и неправильно сериализовать вещи.

В противном случае, если вы используете типизированные объекты [Serializable], я обнаружил, что иногда Serializer также сбивается с толку, если вы используете динамические объявления свойств, например:

public string MyName { get; set; }

Но это будет легко повторяемой ошибкой.

9 голосов
/ 25 ноября 2011

Лично у меня возникла та же проблема с сериализацией иерархии классов (не DataTables).

Моя проблема вообще не была связана с автоматическим свойством, фактически у меня их много.Моя проблема заключалась в том, что я забыл включить ссылку на «System.Runtime.Serialization» в одну из своих библиотек DLL, а также забыл добавить некоторые атрибуты [DataContract] в некоторые классы, на которые ссылаются верхние атрибуты [DataMember], в иерархии.

Чтобы отследить мою проблему, я начал с моего корневого класса и удалил некоторые [DataMember] вниз по иерархии, пока не указал точную проблему.Это может занять несколько раз в зависимости от ваших уровней иерархии ...

Надеюсь, это поможет!Eric

1 голос
/ 29 августа 2018

Либо используйте полные свойства с [Serializable], либо используйте [DataContract] и [DataMember].

. Следующее выдало мне ошибку, возможно, из-за того, что .Net создавал вспомогательную переменную под капотом, снекоторый символ, который XmlSerializer не понравился.

[Serializable]
public class MyClass
{
    public int MyValue { get; private set; }
    ...
}

Либо создайте полные свойства

[Serializable]
public class MyClass
{
    int _myValue;
    public int MyValue
    {
        get { return _myValue; }
        private set { _myValue = value; }
    }
    ...
}

Или используйте атрибуты DataContract и DataMember

[DataContract]
public class MyClass
{
    [DataMember]
    public int MyValue { get; private set; }
    ...
}
0 голосов
/ 23 мая 2018

Хорошо, только что столкнулся с другим сценарием на этом.У меня был тип Serializable, используемый в качестве параметра для одного из моих методов операционного контракта.

Комментирование этого конкретного метода из использования позволило мне найти проблему.В этом случае параметром была модель, десериализованная из файла, поэтому я просто заменил реализацию параметром byte [] и запустил логику десериализации на другом конце.

Хотя это не обязательно ответ для всех,в случае типов параметров в ваших методах операционного контракта, которые могут быть сериализуемыми, вы также можете столкнуться с этим исключением.Я хотел бы представить, что их корректное использование с помощью атрибутов DataContract поможет устранить эту проблему.

0 голосов
/ 03 июня 2017

Похожая ошибка сработала, но оказалось, что мой конфигурационный файл (на самом деле это файл clientconfig для silverlight) содержал следующее

   <<security mode="Transport">
       <transport clientCredentialType="None" proxyCredentialType="None" realm=""/>
       <message clientCredentialType="Certificate" algorithmSuite="Default" />
   </security>

Так что иногда сообщения о дополнительных < символах должны восприниматься буквально!

0 голосов
/ 07 ноября 2014

В моем случае у одного из классов было свойство, тип данных которого был object. Примерно так:

public class BuyAddOnServiceRequest
{
    object site_id
}

после изменения на:

public class BuyAddOnServiceRequest
{
    string site_id
}

это сработало!

...