背景:我有一个将新产品放入产品数据库的过程,该产品数据库允许客户进行WCF调用并将原始产品对象发送到执行各种处理的方法中。这种方法变得难以操作且难以维护,因此我决定用工作流服务替换该方法。我已经从原始进程获得了操作合同接口,因此我创建了一个实现相同接口的工作流服务(使用此处列出的技术Workflow Service that Consumes an Existing Contract)。按照刚才提到的链接中的步骤,会导致原始操作合同中方法的自动生成的发送/接收对活动。然后,这些活动将在工作流服务中使用。因此,客户不必更改任何内容,因为他们仍在使用原始合同。
此新工作流服务托管在IIS中。在配置中,我在服务和客户端上指定了一个behaviorviourConfiguration,它应该导致WCF使用protobuf-net进行序列化。此WCF配置与原始进程相同,但地址现在是工作流服务文件(.xamlx文件)而不是原始.svc文件。但是,当服务是WF4工作流服务时,此行为配置会导致问题(基本上它不起作用,我发送到工作流的任何数据最终都为空)。如果我删除此序列化行为,一切都按预期工作。
因此,我的问题是是否可以将protobuf-net序列化与工作流服务一起使用?我已经阅读了这篇文章Configuring Serialization in Workflow Services,它表明因为工作流服务是WCF服务,我们可以选择序列化,但接着只列出两个基本选项(在第一句中)。我原本以为我们可以通过某种方式改变它来添加我们自己的序列化选项,但看不到任何直接的方法。
我的服务合同如下:
[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-net行为没有任何问题)。
此外,我在WCF上启用了消息记录,我可以看到消息中的proto节点填充了序列化对象(在客户端发送日志和wcf接收日志中)。跟踪服务模型,活动和服务模型消息的输出不会显示除wf服务尝试使用的null对象产生的任何其他错误。
欢迎任何想法或建议!