2010-12-10 166 views
-1

我有一个奇怪的问题,我似乎无法诊断,它似乎是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的新旧服务的众多组合与结果:

  1. 老服务更新基准时正常工作,无论它运行在XP或WIN7和是否Web应用程序代码在XP或Win7上。
  2. 新服务不会创建代理,无论是在XP还是Win7上运行,以及Web应用程序代码是在XP还是在Win7上。我从服务参考更新中得不到任何错误,但是,configuration.svcinfoconfiguration91.svcinfo文件没有列出行为,绑定或端点。其余的文件看起来很好。
  3. 我可以使用svcutil来获取元数据并使用新版本的服务生成代理代码。
  4. 更新服务引用时,我确实得到了两个作为数据协定一部分的项目,它们显示在对象资源管理器中,但只有其中一个是正确的。我没有得到任何客户或其他数据合同对象。
  5. 踢球者是,Windows窗体应用程序工作得很好,包括更新引用和调用服务方法。咦?

我看过新服务中的服务,行为和端点定义,它们与旧服务相匹配。没有网上,我可以找到引用这样的错误。我意识到我必须在新代码中做错了什么,但是由于它在WinForms应用程序中正常工作,所以我无法解释这种差异。

任何帮助将不胜感激。或许我可以保留一些我的头发;)

CNC中

阅读我做了一些调查研究,答案后和尝试了一些更多的东西:

我已经看过了XSD, etc文件,这些服务没有任何安全性,并且在事务恢复之后,它们以DataContract属性的顶级枚举方式(不具备这些属性)并且还将安全值恢复到原来的状态。在这两种情况下,我都没有看到任何不妥之处,除了这些文件的命名方式不同:旧的服务引用使用xsd文件,其数字后缀范围为2 - 5,而最新的一个使用1 - 4(不能看到这应该影响的东西,因为svcmap中的指针似乎是正确的)。它确实使事情变得更加困难,但我仔细查看了每个文件,数据似乎是正确的,只是放在了不同的文件中。

WSDL文件,安全恢复到旧值后,除了主机IP和机器名,符合市场预期一致。但configuration.svcinfoconfiguration91.svcinfo仍没有定义的端点,行为或绑定。另外,奇怪的是,在确定的两个数据合约中,只有一个新成员:其数据成员不存在。这是引用标记为Serializable但未列入DataContract属性的类的数据合同。唯一改变的地方是我为该类添加了一个新的字符串成员。更奇怪的是,在xsd文件中有一个合适的数据约定类的定义。

我很困惑。

回答

1

好,很多把玩一下后,我终于想通了这一点。这个问题是由于我在服务中使用了与Web服务中相同的程序集(我在Web应用程序中使用了程序集的不同部分)。这导致了一个类是数据合同的一部分,我修改了该服务的用途,使其在Web应用程序的编译程序集中与服务发布时不同。这反过来导致服务引用无法生成客户端代理。没有客户端代理,我的Web应用程序代码显示错误,所以我从来没有试过编译解决方案。简单的答案是只在Web应用程序(工作)中构建常用程序集,然后服务引用正确地生成代理。想象一下,我是如何让一个类的单个数据成员成为问题的明显原因,但是它的名称,数据类型,代码中的位置等对这个问题没有影响!无论如何,无论如何,重复使用这个程序集可能是糟糕的设计 - 可能更好地从服务本身消费这些信息。最后一点,winform应用程序工作的原因是因为我也在winform应用程序中使用了相同的程序集,并且在编译应用程序时它始终保持最新,所以这些更改从未发生冲突。希望这有助于未来的人。作为微软的一个便笺 - 关于这场冲突的任何错误信息都会极大地帮助解决问题,尽管我承认这可能不是一种常见的情况。

0

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

+0

有趣的是,我正好在顶部水平的变化部分添加一个枚举,我会在差异比较的XSD,看看还有谢谢 - !。我永远不会想到这样的问题,你是怎么解决你的问题的? – 2010-12-12 02:11:10

+0

我们发现(偶然)一些解决方法。 e是通过将枚举包装到其他结构中来将枚举向下移动。更好的解决方法之一是确保MessageBodyMemberAttribute的Name属性与枚举的类型相同。 – 2010-12-13 18:35:18

7

是的,也许你从你的应用程序到您的合同程序集的引用,当你通过生成代理“添加服务引用...”你是在引用程序重用类型,这就是为什么你的合同主体不正在生成。 为了解决这个问题,当你将你的服务引用我建议你点击“高级”按钮,那么你应该在引用程序取消对“再利用型”或者只是从您的应用程序中删除合同装配参考。

我希望这项工作为你

Service reference settings