今日、WCF デシリアライゼーションでエラーが発生し始めました。コードは変更されておらず、何ヶ月も機能しています。
XmlException
問題は、 「名前を '<' 文字で開始することはできません」というランタイムs が表示されることです。.NET ソースをデバッグしましたが、WCF サービス呼び出しからの戻りオブジェクトを逆シリアル化する際にエラーが発生しているようです。これらのオブジェクトは自動プロパティを使用して定義されており、バッキング フィールドには のような名前が付けられているよう<MyProperty>k_BackingField
です。これが XmlException の発生元です。
人々が受け入れる解決策が「自動プロパティを使用しないようにコードを変更した」という他のいくつかの参照をオンラインで見たことがありますが、これは私には受け入れられません。それらの間のプロパティの)。また、先週実行したときも同じコードが正常に機能していましたが、シリアライズされたすべての DTO に影響するわけではなく、一部だけに影響するようです。
さらにイライラさせるために、それは穏やかに断続的に見える. 今朝、時折、例外がスローされませんでした...!
質問;
- この問題が、変更されていないコードと変更されていないフレームワーク ソースに突然現れたのはなぜですか?
- 完全に実装されたプロパティを使用するようにすべての DTO を変更せずに、これを修正するにはどうすればよいですか?
更新: 1 日ほど正常に動作した後、この問題が再発しました。動作する/動作しない/再び動作する理由を見つけることができる理由はありませんが、ここにあります。
ServiceKnownType
シリアライゼーションの既知の型を定義するために使用される属性を使用して、ServiceContracts にあるコードに関連する問題をさらに追跡しました。エラーで報告されている型は、その時点で行っているサービス呼び出しの一部ではありませんが、このエラーは、この既知の型の「公開」動作の一部である型で発生しているようです。
いくつかのプロキシ作成コードを使用していくつかのサービス動作を適用すると、問題が発生します。
IOperationBehavior innerBehavior = new PreserveReferencesOperationBehavior(
description, this.preserveReferences, this.maxItemsInObjectGraph);
innerBehavior.ApplyClientBehavior(description, proxy);
ApplyClientBehavior
コードは一部であるためデバッグできませんSystem.ServiceModel
(またはできますか?) が、そのメソッドの何かが、ServiceKnownType
属性を使用して公開したすべての型を検証しようとしており、一部の型を this で壊しています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 '<'
したがって、そのクラスで物議を醸すものはなく、考慮すべき継承もありません。これはサービス コントラクトの一部ではなく、シリアル化の既知の型として以前に公開されたものです。
これはかなり難解になってきているので、答えは期待していませんが、問題がどこにあるかを更新するだけです。