【发布时间】:2010-12-10 22:51:04
【问题描述】:
我有一个奇怪的问题,我似乎无法诊断,这似乎是 PEBCAC 的问题,但我花了很多时间试图解决它。我创建了一个通过 Windows 服务托管的 WCF 服务。这项服务已经运行了一段时间,我有一个 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 上尝试了许多新旧服务的组合,结果是:
- 旧服务在更新引用时运行良好,无论是在 XP 还是 Win7 上运行,也无论 Web 应用代码是在 XP 还是 Win7 上。
- 新服务不会创建代理,无论是在 XP 还是 Win7 上运行,也无论 Web 应用程序代码是在 XP 还是 Win7 上。我没有从服务参考更新中得到任何错误,但是,
configuration.svcinfo和configuration91.svcinfo文件没有列出任何行为、绑定或端点。其余文件看起来都很好。 - 我可以使用
svcutil获取元数据并使用新版本的服务生成代理代码。 - 更新服务引用时,我确实在对象资源管理器中显示了属于数据协定一部分的两项,但只有一项是正确的。我没有得到客户端或其他数据合同对象。
- 关键在于 Windows 窗体应用程序与新服务配合得很好,包括更新引用和调用服务方法。嗯?
我查看了新服务中的服务、行为和端点定义,它们与旧服务相匹配。网上没有我能找到这样一个错误的参考。我意识到我必须在新代码中做错了什么,但由于它在 WinForms 应用程序中运行良好,我无法解释其中的差异。
任何帮助将不胜感激。也许我可以保留一些头发;)
-编辑-
在阅读了答案后,我做了更多的研究并尝试了更多的东西:
我已经查看了没有安全性的服务的 xsd 等文件,并且在将事物恢复到具有 DataContract 属性的顶级枚举的方式之后(没有这些),并且还恢复了安全值恢复到以前的水平。在这两种情况下,我都没有发现任何问题,只是文件的名称不同:旧的服务引用使用 xsd 文件,其数字后缀范围为 2 - 5,而最新的服务引用使用 1 - 4(看不出这应该影响事物,因为 svcmap 中的指针似乎是正确的)。它确实使区分事物变得更加困难,但我已经详细查看了每个文件,数据似乎正确,只是放在不同的文件中。
wsdl 文件,在安全性恢复到旧值后,除了主机 IP 和机器名称外,与预期相同。但是configuration.svcinfo 和configuration91.svcinfo 仍然没有定义端点、行为或绑定。此外,奇怪的是,在确实定义的两个数据合约中,一个只有一个新成员:它的数据成员不存在。这是一个引用标记为Serializable 的类的数据协定,但未使用DataContract 属性列出。唯一改变的是我在类中添加了一个新的字符串成员。更奇怪的是,在 xsd 文件中数据协定类的定义是正确的。
我很困惑。
【问题讨论】: