WCF 回调实现函数永远不会被调用

标签 wcf callback

我正在设计一个带有回调的 WCF 服务,但我的回调函数实现永远不会被调用。我对生成的服务代理感到困惑,所以请帮忙。

这里是场景:在服务器端,我定义了服务接口(interface)IMyService和回调接口(interface)IMyServiceCallback,我还在服务器项目中实现了IMyService。除了服务器项目之外,我肯定还有另一个客户端项目,我在 VS 中添加了服务引用。我在客户端实现了IMyServiceCallback接口(interface)。那么问题来了:当我调试它时,该函数永远不会进入我的 IMyServiceCallback 实现,当然也永远不会出现所需的结果。

这就是我感到困惑的地方:当我在客户端添加服务引用时,它实际上在本地生成了三个接口(interface):IMyService、IMyServiceCallback 和 IMyServiceChannel 加上客户端代理类。在我的 IMyServiceCallback 本地实现中,我声明了该类来实现本地 IMyServiceCallback 接口(interface),而不是服务端的接口(interface)。这可能是问题所在吗?为什么在不同的项目(因此不同的命名空间)下有两个接口(interface)声明?我实现客户端接口(interface)的原因是,如果我从服务器端接口(interface)实现,当我尝试调用服务时,它会给出错误:“提供给 ChannelFactory 的 InstanceContext 包含一个未实现 CallbackContractType 的 UserObject 错误”。另一个令人困惑的部分是,在服务器端,如果我将回调接口(interface)名称声明为 IMyCallback 或其他名称,而不是 IMyServiceCallback,则在客户端生成的接口(interface)仍然是 IMyServiceCallback,它是服务接口(interface)的名称加上后缀“回调”。在这种情况下,我还得到了“提供给 ChannelFactory 的 InstanceContext 包含未实现 CallbackContractType 错误的 UserObject”。

我想我对“添加服务引用”以及我应该如何实现接口(interface)(实现哪个接口(interface))有一些误解。有人可以帮助我吗?谢谢!

更新:

我以某种方式解决了这个问题。首先,这两个声明是可以的。本地客户端需要实现本地接口(interface),该接口(interface)是在添加服务引用时生成的。我的问题是我还定义了一个 DataContract 但生成的引用文件没有它。可能是因为我添加了服务项目的程序集作为引用(有人说在这种情况下添加服务引用不会生成数据契约),或者因为我缺少 DataMember 属性。但无论如何,在我修复了这两个部分之后,该功能现在可以工作了。

最佳答案

当您“添加服务引用”并生成代理时,它与您的服务实现完全分开。请记住,您可能正在使用不是您编写的服务,并且无权访问服务源代码。

客户端代码应使用客户端生成的接口(interface)。如果您更改服务,则需要重新生成代理。

如果您发现这太困惑,并且您知道您将始终控制两端,则可以在公共(public)程序集中共享服务接口(interface),并使用 DuplexChannelFactory.CreateChannel() 在运行时生成代理类 .

至于你的问题,我只能假设你没有正确注册你的回调。这已涵盖here

关于WCF 回调实现函数永远不会被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9922174/

相关文章:

c# - .NET 可扩展的 Pub/Sub 服务实现

c# - WCF 服务中的 SQLite AccessViolationException

javascript - 使用 jQuery 并行执行多个 promise 后等待完成

c# - 为什么 WCF 中需要 KnownTypeAttribute

wcf - 为什么 DataContractSerializer 不支持属性?

c# - 调试编码的 WorkflowServiceHost

javascript - 谷歌分析 : how to track outbound links that open in a new tab?

c++ - 我可以从 opengl 的显示屏上调用我的回调函数吗

node.js - Passport Facebook 验证未调用回调

Python:回调问题