【问题标题】:WCF SOAP suddenly switched to message contractsWCF SOAP 突然切换到消息契约
【发布时间】:2015-11-09 12:38:22
【问题描述】:

我正在开发一个 WCF SOAP 服务,该服务突然切换到在每个操作上生成消息协定。因此,之前,将在客户端通过 wsdl 在生成的类中生成具有相同签名的字符串 Foo(int bar) 之类的方法,现在它正在生成签名 FooResponse Foo(FooRequest request)。目前还不清楚是什么变化导致了这种情况,但是我们在这个服务合同中有几十个方法,用 [MessageContract(IsWrapped = false)] 装饰所有东西是不切实际的,我当然不应该这样做,因为我们得到了自动-生成我们之前想要的代码。有没有其他方法可以让它恢复到以前的工作方式?

【问题讨论】:

  • 您是否在控制服务和消费者的源代码?
  • 服务的源代码和消费者的源代码由同一公司的不同团队管理。
  • 在这种情况下,最安全的做法是让服务团队将服务和操作合同接口和服务类型程序集发布为 nuget 包。然后客户端团队可以使用 nuget 包而不是服务引用。问题解决了。

标签: c# web-services wcf soap wsdl


【解决方案1】:

我不知道是什么原因造成的,但解决方案是删除所有服务引用,直接通过从ChannelFactory.CreateChannel() 返回的运行时生成的代理调用服务。

除了使用公共 Web 服务之外,没有理由更喜欢使用系统生成的服务引用而不是这种方法。

虽然最终是确定性的,但服务引用背后的代码生成过程对启动条件高度敏感,并会增加另一层内容,这可能会导致您的客户端应用程序出错,正如您所发现的那样。

感谢这并不能直接解决您的问题。

【讨论】:

  • 我真的不想讨论强静态类型的优点,但我们更喜欢它们,系统生成的服务为我们提供了它们。而且我们更喜欢不必手动编码/维护它们。
  • @user7710 您的评论没有意义。通过通道调用服务绝对需要您访问服务和操作合同二进制文件 - 唯一的区别是您直接引用它们,而不是使用服务引用时的推断等效项。通过使用系统生成的代码,使用服务引用的事实实际上将您从实际的服务类型中移除。我的观点是,如果您删除服务引用并直接使用通道调用服务,您根本不会遇到问题。
【解决方案2】:

我找到了导致问题的更改。目前尚不清楚为什么这会导致问题,但确实如此:

由于我不会深入讨论的原因,消费者 csproj 位于一个解决方案中,其中包含另一个 csproj,我们以 NuGet 包的形式交付给公司的其他团队。 Web 服务已安装该软件包。我们的消费者还拥有对该 NuGet 包中提供的 csproj 的项目引用。有人删除了项目引用并改为通过 NuGet 重新安装。无论出于何种原因,这都会导致服务引用生成与消息合同发生冲突。恢复它可以解决问题。

【讨论】:

    猜你喜欢
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-27
    • 1970-01-01
    相关资源
    最近更新 更多