web-dev-qa-db-ja.com

WCFサービスリファレンス-クライアント側で「XmlException:名前を「<」文字で始めることはできません。16進値0x3C」を取得する

WCFを介してサーバーと通信するスマートクライアントアプリケーションがあります。データはクライアントで作成され、サービスを介して送信されて永続化されます。サーバーとクライアントは共有dllを介して同じドメインクラスを使用し、SvcUtil.exeをラップしてクライアントクラスとプロキシクラスを生成するVisualStudioの便利な「サービス参照の追加」機能を使用しています。

サービスを呼び出そうとすると、次のエラーが発生します。

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フォルダーに生成されたプロキシを調べましたが、異常なものは何も見つかりませんでした。生成されたファイルで角かっこが使用されるのは次のとおりです。

  • * .svcinfo、Reference.svcmap、AwesomeService.disco、AwesomeService.wsdl、および* .xsdファイルのxmlタグ
  • 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

これを引き起こす原因とそれを防ぐにはどうすればよいですか?または、これをさらにトラブルシューティングするにはどうすればよいですか?

26
alt_tab

DataTablesを見てください(データの転送に使用している場合)。

DataTable名が空の場合、Serializerが混乱し、正しくシリアル化されない可能性があります。

それ以外の場合、型指定された[Serializable]オブジェクトを使用している場合、動的プロパティ宣言を使用すると、Serializerも混乱することがあります。

public string MyName { get; set; }

しかし、これは簡単に再現可能なエラーになります。

16
ReinhardtB

個人的には、(DataTablesではなく)クラス階層のシリアル化で同じ問題が発生しました。

私の問題は自動プロパティとはまったく関係がありませんでした。実際、私にはたくさんあります。私の問題は、dllの1つに「System.Runtime.Serialization」への参照を含めるのを忘れ、上位の[DataContract]属性によって参照されるいくつかのクラスにいくつかの属性[DataMember]を追加するのを忘れたことでした。階層。

問題を追跡するために、ルートクラスから開始し、正確な問題が指摘されるまで、階層の[DataMember]をいくつか削除しました。階層レベルによっては、時間がかかる場合があります...

それが役に立てば幸い!エリック

9
Eric Ouellet

[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; }
    ...
}
1
user276648

同様のエラーが発生しましたが、構成ファイル(実際にはSilverlightのclientconfigファイル)に次のものが含まれていることが判明しました。

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

したがって、余分な<文字に関するメッセージは、文字通りに解釈する必要がある場合があります。

1
Simon_Weaver

私の場合、クラスの1つにプロパティがあり、そのデータ型はオブジェクトでした。このようなもの:

public class BuyAddOnServiceRequest
{
    object site_id
}

これを次のように変更した後:

public class BuyAddOnServiceRequest
{
    string site_id
}

出来た!

0
defilerc

さて、これについて別のシナリオに出くわしました。 OperationContractメソッドの1つのパラメーターとしてSerializable型を使用しました。

この特定の方法を使用からコメントアウトすることで、問題を見つけることができました。この場合、パラメーターはファイルから逆シリアル化されたモデルであったため、実装をbyte []のパラメーターに置き換え、もう一方の端で逆シリアル化ロジックを実行しました。

必ずしもすべての答えであるとは限りませんが、シリアル化可能なオペレーションコントラクトメソッドのパラメータタイプの場合、この例外が発生する可能性もあります。それらを正しいDataContract属性で装飾すると、この問題の修正に役立つと思います。

0
wildshane