我有一个奇怪的问题,我似乎无法诊断,它似乎是PEBCAC的事情,但我花了很多时间试图解决它。我创建了一个通过Windows服务托管的WCF服务。这项服务一直工作得很好,我有一个Windows窗体和一个Web界面。该服务最初是在XP上开发的,但我最近已迁移到Windows 7.当我迁移时,我发现该服务的Windows安全性阻止了我在Windows 7上使用我的WinForms应用程序,但它在XP上交谈时工作得很好Windows Server 2008 R2,Windows 7和XP上的服务。为了简化发展过程中的事情,我完全禁用了安全性,并且我的WinForms应用程序再次在Windows7上运行。WCF无法生成客户端代理
然后,我对WCF服务进行了一些其他更改,添加方法,更改数据协定等。唯一的端点更改是禁用wshttp的安全性。突然间,更新Web应用程序的服务引用不再创建客户端代理,但它确实生成了wsdl和xsd文件。我曾尝试在XP和Win7的新旧服务的众多组合与结果:
- 老服务更新基准时正常工作,无论它运行在XP或WIN7和是否Web应用程序代码在XP或Win7上。
- 新服务不会创建代理,无论是在XP还是Win7上运行,以及Web应用程序代码是在XP还是在Win7上。我从服务参考更新中得不到任何错误,但是,
configuration.svcinfo
和configuration91.svcinfo
文件没有列出行为,绑定或端点。其余的文件看起来很好。 - 我可以使用
svcutil
来获取元数据并使用新版本的服务生成代理代码。 - 更新服务引用时,我确实得到了两个作为数据协定一部分的项目,它们显示在对象资源管理器中,但只有其中一个是正确的。我没有得到任何客户或其他数据合同对象。
- 踢球者是,Windows窗体应用程序工作得很好,包括更新引用和调用服务方法。咦?
我看过新服务中的服务,行为和端点定义,它们与旧服务相匹配。没有网上,我可以找到引用这样的错误。我意识到我必须在新代码中做错了什么,但是由于它在WinForms应用程序中正常工作,所以我无法解释这种差异。
任何帮助将不胜感激。或许我可以保留一些我的头发;)
CNC中
阅读我做了一些调查研究,答案后和尝试了一些更多的东西:
我已经看过了XSD, etc文件,这些服务没有任何安全性,并且在事务恢复之后,它们以DataContract
属性的顶级枚举方式(不具备这些属性)并且还将安全值恢复到原来的状态。在这两种情况下,我都没有看到任何不妥之处,除了这些文件的命名方式不同:旧的服务引用使用xsd文件,其数字后缀范围为2 - 5,而最新的一个使用1 - 4(不能看到这应该影响的东西,因为svcmap中的指针似乎是正确的)。它确实使事情变得更加困难,但我仔细查看了每个文件,数据似乎是正确的,只是放在了不同的文件中。
WSDL文件,安全恢复到旧值后,除了主机IP和机器名,符合市场预期一致。但configuration.svcinfo
和configuration91.svcinfo
仍没有定义的端点,行为或绑定。另外,奇怪的是,在确定的两个数据合约中,只有一个新成员:其数据成员不存在。这是引用标记为Serializable
但未列入DataContract
属性的类的数据合同。唯一改变的地方是我为该类添加了一个新的字符串成员。更奇怪的是,在xsd文件中有一个合适的数据约定类的定义。
我很困惑。
有趣的是,我正好在顶部水平的变化部分添加一个枚举,我会在差异比较的XSD,看看还有谢谢 - !。我永远不会想到这样的问题,你是怎么解决你的问题的? – 2010-12-12 02:11:10
我们发现(偶然)一些解决方法。 e是通过将枚举包装到其他结构中来将枚举向下移动。更好的解决方法之一是确保MessageBodyMemberAttribute的Name属性与枚举的类型相同。 – 2010-12-13 18:35:18