0

.net シリアル化可能なクライアント データを受け取る操作を持つ WCF サービスがあります。

[OperationContract]
void SaveMyData(long id, string name, object serializableData);

[OperationContract]
object LoadMyData(long id, string name);

サーバーはデータが何であるかを知る必要はなく、データを保存するか、保存されているものを返すだけです。また、サーバーはシリアル化される型を認識していないため、当然、このコントラクトによって逆シリアル化の例外が発生します。

たとえば、次のように、WCF コントラクトとは無関係にこれをシリアル化/逆シリアル化できることを知っています。

[OperationContract]
void SaveMyData(long id, string name, byte[] serializedData);

[OperationContract]
byte[] LoadMyData(long id, string name);

ただし、これには、シリアル化および逆シリアル化するために、クライアントに追加のコードが必要です。私はそれを避け、クライアント コードをできるだけシンプルにしたいと考えています。

WCF 呼び出しをラップし、追加のシリアル化/逆シリアル化を実行するクライアント dll にビルド前のプロキシを作成できることはわかっています。しかし、WSDL から生成されたクライアントに依存できるようにしたいと考えています。

理想的には、RawAttribute(ユニバーサル ルート タイプの) シリアライゼーション/デシリアライゼーションを抑制しobject、代わりに操作から (オブジェクト)byte[] (または (オブジェクト)Stream?) を提供または期待するパラメーターまたは戻り値に a を配置できます。

[OperationBehavior]
public void SaveMyData(long id, string name, [Raw] object serializableData){ ... }

[OperationContract, Raw]
object LoadMyData(long id, string name);

私は見てきましたがDataContractSurrogateDataContractResolverこれを達成する方法がわかりません。DataContractSurrogateタイプと逆シリアル化されたオブジェクトが既に提供されているため、逆シリアル化パイプラインでは遅すぎるようです。リゾルバーはデータを提供せず、型情報のみを提供します。どちらも、RawAttribute.

WCF はこれに対して適切な拡張ポイントを提供していますか? それとも組み込みの方法ですか?

また、シリアル化されたデータから抽出された宣言された型が何であるかを知りたいのですが、それは必要ありません。

ありがとう!

4

1 に答える 1

0

WCF のシリアル化メカニズムと戦う代わりに、1 レベルの抽象化をやめて、WCF のメッセージ レベルで作業する必要があります。あなたが探しているのは、あらゆるクライアントからのメッセージを受け入れることができる一種の「ユニバーサル」サービスです。WCF Messaging に関するこの古いが、まだ適用可能な MSDN の記事を読んでください。この記事の最後 (図 8) は、汎用 WCF サービスのサンプル コードです。少なくとも、シリアライゼーションをバイパスするサービスを作成する手がかりになるはずです。

于 2013-08-01T12:23:07.383 に答える