2011-01-10 5 views
0

私はオブジェクトがWebサービスを通じて公開されているサードパーティAPIを使用しています。残念ながら、APIにはオブジェクトのIDフィールドが0の場合にいくつかのプロパティにアクセスしようとすると例外がスローされるなどいくつかの癖があります。WCFサービスがクライアント上のオブジェクトプロパティを検査しないようにすることはできますか?

したがって、サーバー上にオブジェクトの有効なインスタンスを作成し、WCFサービスクライアント。この問題は、クライアントがオブジェクトを受け取ったときに発生します。どんな理由であれ、サービスはの前にのオブジェクトのそれぞれのプロパティを検査して、クライアント上にそれを設定しているようです。だから、オブジェクトはクライアントが受け取ったときに例外をスローしていますが、私はそれらで何かできるようになります。何が起こっているかを示すための簡単なコード例を示します。サービスで

public class ExposedClass { 
    public int Id { get; set; } 

    List<OtherClass> _other; 
    public List<OtherClass> Other { 
    get { 
     if (Id == 0) throw new Exception("Can't access field 'other' if object not initialized"); 
     return _other; 
    } 
    } 
} 

[ServiceContract] 
public MyService { 
    [OperationContract] 
    public ExposedClass GetThing() { 
    ExposedClass c = new ExposedClass(); 
    c.Initialize(); // makes the Id field valid 
    return c; 
    } 
} 

とクライアント:

[TestMethod] 
public void GetThingFromService { 
    var svcClient = new MyClient(); 
    var c = svc.GetThing(); // exception thrown here on client 
    Assert.IsNotNull(c); 
} 

任意のアイデア?

+0

クライアントにはどのような例外がありますか? –

+0

恐ろしい "接続が予期せず閉じられました"というエラー。 –

答えて

4

通常、DataContractクラスにはプログラミングロジックが含まれてはいけません。これは、クライアントに渡される情報を格納する一種のコンテナとして使用されます。

私のアプローチは、必要な情報をカスタムDTO(データ転送オブジェクト)にコピーしてからネットワークに送信することです。

サードパーティのクラスは実際にクライアント側で必要ですか?可能であれば、サードパーティのオブジェクトをサーバ上で破棄して、制御できないバグの多いコードからユーザをレイヤ化して分離することをお勧めします。

+0

+1これは問題の素晴らしい解決策です。私が提案したものよりずっと簡単です。 :) – NotMe

1

二つの可能性があります。

  1. ライブラリの開発者に連絡し、彼らは自分のコードを修正する必要があるということを伝えるには。
  2. ライセンスを許可している場合は、その使用を禁止してください。リフレクターを使用してアセンブリを分解し、修理してから、再コンパイルしてください。

オブジェクトは、この正確な理由で割り当てられるフィールドの順序に決して依存してはいけません。

関連する問題