3

背景:我有一个将新产品放入产品数据库的过程,该过程允许客户进行 WCF 调用并将原始产品对象发送到进行各种处理的方法中。这种方法变得笨重且难以维护,因此我决定用工作流服务替换该方法。我已经从原始流程中获得了操作合同接口,因此我创建了一个实现相同接口的工作流服务(使用此处概述的技术Workflow Service that Consumes an Existing Contract)。按照刚才提到的链接中的步骤,将为原始操作合同中的方法自动生成发送/接收对活动。然后在工作流服务中使用这些活动。因此,客户无需更改任何内容,因为他们仍在使用原始合同。

这个新的工作流服务托管在 IIS 中。在配置中,我在服务和客户端上都指定了一个 behaviorConfiguration,这应该导致 WCF 使用 protobuf-net 进行序列化。此 WCF 配置与原始流程相同,只是地址现在是工作流服务文件(.xamlx 文件)而不是原始 .svc 文件。但是,当服务是 WF4 工作流服务时,这种行为配置会导致问题(基本上它不起作用,并且我发送到工作流中的任何数据最终都为空)。如果我删除此序列化行为,一切都会按预期工作。

因此,我的问题是是否可以将 protobuf-net 序列化与工作流服务一起使用?我读过这篇文章在工作流服务中配置序列化,它表明因为工作流服务是 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-网络行为没有任何问题)。

此外,我在 WCF 上启用了消息日志记录,我可以看到消息中的 proto 节点填充了序列化对象(在客户端发送日志和 wcf 接收日志中)。跟踪服务模型、活动和服务模型消息的输出不会显示任何其他错误,除了 wf 服务尝试使用的空对象导致的错误。

欢迎任何想法或建议!

4

0 回答 0