背景: 私は、クライアントが WCF 呼び出しを行い、生の製品オブジェクトをさまざまな処理を行うメソッドに送信できるようにする製品データベースに新製品を入れるプロセスを持っていました。この方法は扱いにくく、保守が困難になったため、この方法をワークフロー サービスに置き換えることにしました。元のプロセスの操作コントラクト インターフェイスが既にあるので、同じインターフェイスを実装するワークフロー サービスを作成しました (ここで概説されている手法を使用して、既存のコントラクトを使用するワークフロー サービスを使用します)。)。上記のリンクの手順に従うと、元の操作コントラクトのメソッドに対して自動生成された送信/受信ペア アクティビティが生成されます。これらのアクティビティは、ワークフロー サービスで使用されます。したがって、クライアントは元の契約を引き続き使用しているため、何も変更する必要はありませんでした。
この新しいワークフロー サービスは、IIS でホストされます。構成では、サービスとクライアントの両方で behaviourConfiguration を指定しています。これにより、シリアル化に protobuf-net を使用して WCF が発生するはずです。この WCF 構成は、アドレスが元の .svc ファイルではなく、ワークフロー サービス ファイル (.xamlx ファイル) になっている点を除いて、元のプロセスと同じです。ただし、サービスが WF4 ワークフロー サービスの場合、この behaviourConfiguration が問題を引き起こしています (基本的には機能せず、ワークフローに送信したデータは null になります)。このシリアル化動作を削除すると、すべてが期待どおりに機能します。
したがって、私の質問は、ワークフロー サービスで protobuf-net シリアル化を使用することは可能ですか? ワークフロー サービスでシリアル化を構成するこの記事を読みましたが、ワークフロー サービスは WCF サービスであるため、シリアル化を選択できることを示唆していますが、次に 2 つの基本的なオプション (最初の文) のみをリストします。これを何らかの方法で変更して、シリアル化のための独自のオプションを追加できると思っていたのですが、それを行う簡単な方法がわかりません。
私のサービス契約は次のようになります。
[ServiceContract(Namespace = "http://www.MyCompany.com/services/", Name = "NewProductApprovalWorkflow")]
[ContractClass(typeof(NewProductApprovalWorkflowContracts))]
public interface INewProductApprovalWorkflow
{
/// <summary>
/// Instantiates a new product approval workflow.
/// </summary>
/// <param name="product"></param>
/// <returns></returns>
[OperationContract]
Product StartNewProductApprovalWorkflow(Product product);
/// <summary>
/// Approves the product for approval in the product catalog
/// </summary>
/// <param name="product"></param>
/// <returns></returns>
[OperationContract]
Product CompleteProductApprovalWorkflow(Product product, ProductApproval approvalInfo);
}
"Product" および "ProductApproval" オブジェクトは大きすぎてここに投稿できませんが、基本的にはプリミティブ型であり、シリアライゼーションの観点から十分にテストされています (これらはプラットフォーム全体でさまざまな WCF サービスで使用され、すべて protobuf-ネットの動作は問題ありません)。
また、WCF でメッセージ ログを有効にすると、メッセージの proto ノードにシリアル化されたオブジェクトが取り込まれていることがわかります (クライアント送信ログと wcf 受信ログの両方で)。サービス モデル、アクティビティ、およびサービス モデル メッセージからの出力をトレースしても、wf サービスが使用しようとする null オブジェクトに起因するものを除いて、他のエラーは表示されません。
アイデアやアドバイスは大歓迎です!