【问题标题】:How can I Manually create a client proxy for a WF4 (xamlX) Service如何手动为 WF4 (xamlX) 服务创建客户端代理
【发布时间】:2012-02-14 18:30:51
【问题描述】:

我通过将 WorkflowServiceHost 包装在 WCF 服务中创建了多个服务;使用 WorkflowHostingEndpoint。这样做我能够定义我的服务契约并创建代理类来连接到这些服务。

我现在正在创建一个服务,我想在其中使用 WF4 消息传递活动并再次自行托管该服务。我也真的很想手动创建我的代理类,而不使用 VS2010 或 ServiceUtil 中的 ServiceReference ...

我已经看到一些在服务客户端中使用发送活动的引用,但我希望能够使用直接针对服务合同创建的更“类似 WCF”的代理,就像我对其他代理所做的那样服务。我怎样才能做到这一点?是否有 xamlX(或带有消息传递活动的 xaml)存储我可以用来手动生成代理的接口合同?

注意:我不想使用 WF_WCF_Samples 中描述的发送活动。

更新: 在发布此问题之前,我尝试创建与工作流接收活动相同的界面;但我不断收到以下错误:

带有 Action 'http://tempuri.org/ISvrClientService/Create' 的消息 由于 ContractFilter 不匹配,无法在接收方处理 在 EndpointDispatcher。这可能是因为合同 mismatch(发送方和接收方之间的操作不匹配)或 发送方和接收方之间的绑定/安全不匹配。查看 发送者和接收者具有相同的合同和相同的绑定 (包括安全要求,例如消息、传输、无)。

谢谢!

【问题讨论】:

标签: workflow-foundation-4


【解决方案1】:

无需使用发送活动。当您托管工作流服务时,您托管的是 SOAP 端点,唯一的区别是实现,但这是一个私有细节。您可以像使用任何其他 WCF 服务一样使用 ChannelFactory 创建代理对象。

var factory = new ChannelFactory<IYourService>();
var proxy = factory.CreateChannel();

IYourService 接口是你必须手工制作的东西。服务器上没有,它是在工作流中完成的,所以你必须编写相同的合约。

【讨论】:

  • 我在上面包含了一个更新...基本上,当我创建一个单独的接口并且我无法访问工作流的接收活动 ServiceContractName 属性中的接口时,我总是收到关于绑定不匹配的错误。
  • 您是否尝试过创建测试控制台应用并添加服务参考?我知道这不是您想要使用的,但请仔细查看生成的代码,以便发现差异。
  • 谢谢莫里斯。我能够验证问题出在服务而不是客户端。我决定使用 Xamlservices 来捕获 xamlx 服务,然后调用 WorkflowServiceHost。
【解决方案2】:

我已经使用通道工厂和手动创建的接口成功地完成了这项工作。诀窍在于匹配回复/发送输入/输出参数名称,而不仅仅是类型签名。

如果您的工作流程中有相关的书签,这一点尤其重要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多