我在服务器上运行的 IIS 中托管了两个 WCF 服务;食人魔 (C#) 和巨魔 (VB.Net)。(是的,那是他们的真名。)在这个过程中,我调用了 Troll 服务中的一个 Web 方法。巨魔反过来又调用食人魔以获得支持功能。
当 Troll 尝试实例化 Ogre 服务客户端时:
Dim ogre As New OgreService.OgreClient
抛出异常。那个例外是
Operations marked with IsOneWay=true must not declare output parameters, by-reference parameters or return values.
现在,食人魔确实有一些方法被定义为一种方式。但是,它们都返回 void 并且没有输出参数。有些确实接受一个对象(在数据合同中定义)作为参数。还有其他几个程序可以毫无问题地调用食人魔。此外,如果我在我的开发系统上运行 Troll,在 Visual Studio 中,调用服务器上的食人魔没有问题。我也可以使用 WCF 测试客户端从我的开发机器上调用服务器上的 ogre,并且没有问题。
我知道这一定是一个配置问题,但我一生都无法弄清楚它是什么。IIS 托管的 WCF 服务在同一台计算机上调用另一个 IIS 托管的 WCF 服务是否存在任何问题?
我什至不确定我可以提供哪些数据可能会有所帮助,因为它只是遇到问题的一种配置。任何关于可能发生的事情的想法将不胜感激。
谢谢。
事实证明,这是 Visual Studio 生成的服务代理的问题。当我配置服务引用时,我不小心选中了“允许生成异步操作”。选择了生成基于任务的操作的选项。
这导致使用返回值的单向装饰来定义方法。
这就是导致问题的原因。由于我不需要异步操作,我只是取消选中该选项,问题就消失了。
它确实提出了其他问题,例如“为什么从我的开发机器运行时它没有失败?” 和“为什么自动生成的客户端会生成无效的代码?” 但这是另一个讨论。