0

WebApp でホストされているプロキシからデータを受信するサービスがあります。DataMembers は Order=* で設定され、isRequired=true も追加しようとしました。問題は、シリアル化および逆シリアル化された情報の 60 フィールドのうち、同じ 3 つの String フィールドが一貫して欠落している (null) ことです。デバッグを実行したところ、データがクライアント ブラウザからプロキシ サービスにそのまま (JSON からシリアル化されたもの) 送信されることがわかりました。プロキシ サービスは、逆シリアル化後に 3 つのフィールドが欠落している Windows サービスにそれを送信します。

フィールドの順序を別の方法で設定しようとしましたが、何も機能していないようです。それは常に同じ 3 つの欠落しているフィールドの単純な文字列であり、多くの場合 10 ~ 20 文字を超えません。これらの厄介な DataMembers が、プログラムの他のすべての領域に正しく取り込まれていることにも言及する価値があります。

プロキシ サービスのコードは次のとおりです。

 public TransactionResult Update(MyObj obj, String ItemOne, String ItemTwo)
    {
        MyService.MyServiceClient proxy = new MyService.MyServiceClient("WSHttpBinding_IMyService");
        proxy.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
        TransactionResult result = proxy.Update(obj, ItemOne, ItemTwo);
        proxy.Close();
        return result;
    }

Windows サービスコードは

[OperationBehavior(Impersonation = ImpersonationOption.Required)]
public TransactionResult Update(MyObj obj, String ItemOne, String ItemTwo)
{obj is missing same 3 values at this point...}

オブジェクトの DataMembers の 1 つの例

[DataMember(Order = 56)]
    public String ItemTwo
    {
        get
        {
            ...
        }
        set
        {
            ...
        }
    }
4

2 に答える 2

0

確認すべきことの 1 つは、署名内の追加のパラメーターがエンティティのプロパティと同じ名前であることです。

署名パラメーターの名前を変更しない理由 (クライアント サービス参照/プロキシを再生成することを忘れないでください)

public TransactionResult Update(MyObj obj, String ItemOne, String ItemTwo)

public TransactionResult Update(MyObj obj, String NewItemOne, String NewItemTwo)
于 2010-11-25T13:46:08.287 に答える
0

アイデア:

  • これらのフィールドが計算されていないことを確認してください (したがって、逆シリアル化の順序に応じて、コードでリセットまたは変更されます)。
  • シリアル化はこれを使用して帯域幅を最適化するため、DefaultValue 属性を定義しないでください。
  • これらのフィールドをハッキングするカスタム動作を宣言しないようにしてください
  • 別の WCF バインディングを試してください (HTTP、NETTCP など)。
  • OnDeserialized、OnDeserializing イベントをフックし、データがあることを確認します
于 2010-11-25T10:12:17.747 に答える