12

今日、WCF デシリアライゼーションでエラーが発生し始めました。コードは変更されておらず、何ヶ月も機能しています。

XmlException問題は、 「名前を '<' 文字で開始することはできません」というランタイムs が表示されることです。.NET ソースをデバッグしましたが、WCF サービス呼び出しからの戻りオブジェクトを逆シリアル化する際にエラーが発生しているようです。これらのオブジェクトは自動プロパティを使用して定義されており、バッキング フィールドには のような名前が付けられているよう<MyProperty>k_BackingFieldです。これが XmlException の発生元です。

人々が受け入れる解決策が「自動プロパティを使用しないようにコードを変更した」という他のいくつかの参照をオンラインで見たことがありますが、これは私には受け入れられません。それらの間のプロパティの)。また、先週実行したときも同じコードが正常に機能していましたが、シリアライズされたすべての DTO に影響するわけではなく、一部だけに影響するようです。

さらにイライラさせるために、それは穏やかに断続的に見える. 今朝、時折、例外がスローされませんでした...!

質問;

  1. この問題が、変更されていないコードと変更されていないフレームワーク ソースに突然現れたのはなぜですか?
  2. 完全に実装されたプロパティを使用するようにすべての 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 '<'

したがって、そのクラスで物議を醸すものはなく、考慮すべき継承もありません。これはサービス コントラクトの一部ではなく、シリアル化の既知の型として以前に公開されたものです。

これはかなり難解になってきているので、答えは期待していませんが、問題がどこにあるかを更新するだけです。

4

6 に答える 6

10

この問題の説明に役立つ情報がさらに見つかったと思います (少なくとも、特定のタイプでのみエラーが表示される理由については)。

それらに対して報告された例外を取得している DTO は次のとおりです。

  • [ServiceKnownType]私の属性の一部として公開
  • でマークされた[Serializable]
  • でマークされていません[DataContract]

[DataContract]タイプに属性を追加すると、この問題が解決します。理由はわかりませんが、このエラーが発生したときに断続的に発生する理由はまだわかりませんが、影響は一貫しています。

于 2012-12-19T02:13:24.557 に答える
0

現在、回避策がありますが、信頼できるものではありません。問題の原因となっている DTO がパブリッシャーから削除されたため[ServiceKnownType]、エラーは解消されました。

例外が発生しているメンバー名に問題があるかどうか疑問に思っています。これまでのところ、私はそれが不平を言っているのを見てきました。

  • Id
  • Address
  • UserName

これらの特定のプロパティ名がシリアライゼーション モデルまたはサービス モデルの別の場所で使用されていると予想するのは理にかなっています。

于 2012-12-19T00:53:18.693 に答える