1

既存の WCF アプリケーションを更新して、protobuf-net サポートを追加しました。基本的に、私は:

  • すべてのデータ オブジェクトを含むアセンブリの参照として protobuf-net.dll (.net 3.0) を追加しました。このアセンブリは、サーバーとクライアントの両方から参照されています

  • [DataMember] を [DataMember(Order = x)] に置き換え (x として増加する int を使用)

  • すべての OperationContracts を ProtoBehavior 属性で更新しました

  • サービス参照を更新しました

クライアントから、サーバーでこのメソッドを呼び出します。

[OperationContract(IsOneWay = false), ProtoBehavior]
ConnectionData Join(string userId, string Password);

ConnectionData は次のように定義されています。

[DataContract]
public class ConnectionData
{
    [DataMember(Order = 1)]
    public ConnectionStatusEnum ConnectionStatus; // this is a normal enum with five elements

    // .....

    [DataMember(Order = 5)]
    public bool MustChangePassword;
}

さて、ここで何が起こっているのですか:

  • サーバーをデバッグすると、ConnectionData オブジェクトが正しく初期化され、Join メソッドで返されることがわかります

  • クライアントをデバッグすると、Join 呼び出しから null オブジェクトが返されます。

  • WCF トレースを最大詳細まで有効にしました。サーバーのログには何も表示されませんでしたが、クライアントのログ ファイルには次の警告メッセージが表示されました。

System.Runtime.Serialization.ElementIgnored
逆シリアル化中に認識されない要素が XML で検出されましたが、無視されました。
要素 http://tempuri.org/:proto

ネットワークトラフィックを盗聴しましたが、これを逆シリアル化できないことをprotobuf-netのせいにしません:

<s:Body><JoinResponse xmlns="http://tempuri.org/"><proto/></JoinResponse></s:Body>

問題をさらにトラブルシューティングし、protobuf-net でメッセージを正しくシリアル化するにはどうすればよいですか?


私はprotobuf-net r275を使用しています

4

2 に答える 2

0

遅れてすみません-労働時間など。両端はこの変更について知っていますか?残念ながら、WCF統合は、クライアントで「mex」によって生成されたプロキシとうまく連携しませんが、アセンブリ共有では問題なく機能します。

または、構成で指定できるエンドポイントの動作を使用するための作業が進行中です。これは100%ではありませんが、間もなく開始されるはずです。これにより、WCFはprotobuf-netを透過的に使用できるようになり、サービス契約に影響を与えることはありません(ただし、メンバーは、[ProtoMember(n)]etcを通じて、または[DataMember(Order=n)]

于 2009-10-23T15:39:05.760 に答える
0

私はこの分野でさらにいくつかの作業を行ってきましたが、共有データ契約を再利用しているにもかかわらず、サービス参照 (IDE または svcutil を介して) があることが問題であると思われます。重複するインターフェースを取得します (そして動作属性を失い、壊れます)。

オプション:

  • サービス参照を使用しないでください (チャネルを直接使用するか、サブクラスを使用しますClientBase<T>)
  • 新しいエンドポイント構成オプションを使用する
  • 生成されたインターフェイスをハックして、動作を含めます (メンテナンスの問題が発生します)

それらに慣れていない場合は、次の数日で最初のオプションのブログ エントリを書く予定です。

于 2009-11-11T17:43:53.977 に答える