WCF无法生成客户端代理

时间:2010-12-10 22:51:04

标签: visual-studio-2008 wcf

我有一个奇怪的问题,我似乎无法诊断,它似乎是一个PEBCAC的事情,但我花了很多时间试图解决它。我创建了一个WCF服务,我通过Windows服务托管。这项服务已经工作了一段时间,我有一个Windows窗体和一个Web界面。该服务最初是在XP上开发的,但我最近已迁移到Windows 7.当我迁移时,我发现该服务的Windows安全性使我无法在Windows 7上使用我的WinForms应用程序,但它在XP上工作得很好Windows Server 2008 R2,Windows 7和XP上的服务。为了简化开发过程中的事情,我完全禁用了安全性,我的WinForms应用程序再次在windows7上运行。

然后,我对WCF服务进行了一些其他更改,添加了方法,更改了数据协定等。唯一的端点更改是禁用wshttp上的安全性。突然,更新Web应用程序的服务引用不再创建客户端代理,但它确实生成了wsdl和xsd文件。我已尝试在XP和Win7上使用旧服务和新服务的多种组合,结果是:

  1. 旧服务在更新引用时工作正常,无论是在XP还是Win7上运行,以及Web应用程序代码是在XP还是Win7上。
  2. 新服务不会创建代理,无论是在XP还是Win7上运行,以及Web应用程序代码是在XP还是Win7上。我从服务引用更新中得不到任何错误,但configuration.svcinfoconfiguration91.svcinfo文件没有列出任何行为,绑定或端点。其余的文件看起来很好。
  3. 我可以使用svcutil获取元数据,并使用新版本的服务生成代理代码。
  4. 更新服务引用时,我确实得到了对象资源管理器中显示的数据合同中的两个项目,但只有其中一项是正确的。我没有客户端或其他数据合同对象。
  5. 踢球者是Windows窗体应用程序适用于新服务,包括更新引用和调用服务方法。咦?
  6. 我查看了新服务中的服务,行为和端点定义,它们与旧服务匹配。我在网上找不到任何引用这样的错误。我意识到我必须在新代码中做错事,但由于它在WinForms应用程序中运行良好,我无法解释其中的差异。

    非常感谢任何帮助。也许我可以保留一些头发;)

    - 编辑 -

    在阅读完答案后,我做了一些更多的研究,并尝试了一些其他的东西:

    我已经查看了没有安全性的服务的xsd等文件,并且在将事物恢复到具有DataContract属性的顶级枚举(没有这些属性)之后也是如此将安全值恢复到以前的状态。在这两种情况下,我都没有看到任何错误,除了文件的名称不同:旧服务引用使用xsd文件,数字后缀范围为2 - 5,而最新的文件使用1 - 4(不能看出这应该是影响事物,因为svcmap中的指针似乎是正确的)。它确实使得难以区分,但我仔细查看了每个文件,数据似乎正确,只是放在不同的文件中。

    在安全性恢复到旧值之后,wsdl文件与主机IP和计算机名称相同,正如预期的那样。但是configuration.svcinfoconfiguration91.svcinfo仍然没有定义端点,行为或绑定。另外,奇怪的是,在定义的两个数据协定中,只有一个新成员:它的数据成员不存在。这是一个数据协定,它引用标记为Serializable的类,但未列出DataContract属性。唯一改变的是我在类中添加了一个新的字符串成员。更奇怪的是,xsd文件中有一个正确的数据协定类定义。

    我很困惑。

3 个答案:

答案 0 :(得分:7)

是的,可能您从应用程序中引用了您的合同程序集,并且当您通过“添加服务引用...”生成代理时,您正在重用引用程序集中的类型,这就是您的合同实体不存在的原因产生。 要在添加服务引用时修复此问题,我建议您单击“高级”按钮,然后取消选中“重用引用程序集中的类型”选项,或者只删除应用程序中的合同程序集引用。

我希望这对你有用!

Service reference settings

答案 1 :(得分:1)

好吧,经过大量的讨论,我最终想出来了。问题是由于我在Web应用程序中使用与服务中使用的相同的程序集(我在Web应用程序中使用了程序集的不同部分)。这导致了一个类,它是数据协定的一部分,并且我已经修改了服务的使用,在Web应用程序的编译程序集中与服务发布时不同。这反过来导致服务引用无法生成客户端代理。没有客户端代理,我的Web应用程序代码显示错误,所以我从未尝试编译解决方案。简单的答案是只在Web应用程序中构建通用程序集(可以正常工作),然后服务引用正确生成代理。想象一下,让一个类的单个数据成员成为问题的可证明原因是多么的困惑,但它的名称,数据类型,代码中的位置等对问题没有影响!无论如何,可能不好的设计重新使用这个程序集 - 可能更好地从服务本身消费这些信息。最后一点,winform应用程序工作的原因是因为我在winform应用程序中也使用相同的程序集,并且在编译应用程序时始终保持最新状态,因此更改永远不会发生冲突。希望这可以帮助将来的某个人。作为微软的一份附注 - 任何有关此冲突的错误信息都会对解决问题产生巨大影响,尽管我认为这可能不是常见情况。

答案 2 :(得分:0)

这是一个很长的镜头,但是比较生成的xsds会发生什么?差异是你所期望的,还是其他一些奇怪的变化没有意义?我问,因为我们发现在操作的顶层涉及枚举的某些合同更改会导致wsdl.exe的行为不同。它似乎回归到使用XmlSerializer而不是DataContractSerializer,它有许多副作用,例如类型从列表更改为数组。我不记得客户端代码生成是否也存在问题。