Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 2008 WCF无法生成客户端代理_Visual Studio 2008_Wcf - Fatal编程技术网

Visual studio 2008 WCF无法生成客户端代理

Visual studio 2008 WCF无法生成客户端代理,visual-studio-2008,wcf,Visual Studio 2008,Wcf,我有一个奇怪的问题,我似乎无法诊断,这似乎是一个PEBCAC的东西,但我花了很多时间试图解决它。我创建了一个通过windows服务托管的WCF服务。这项服务已经运行了一段时间,我有一个windows窗体和一个web界面。这项服务最初是在XP上开发的,但我最近迁移到了Windows7。当我迁移时,我发现该服务的windows安全性阻止我在windows 7上使用我的WinForms应用程序,但在XP上与windows Server 2008 R2、windows 7和XP上的服务对话时,它工作得很

我有一个奇怪的问题,我似乎无法诊断,这似乎是一个PEBCAC的东西,但我花了很多时间试图解决它。我创建了一个通过windows服务托管的WCF服务。这项服务已经运行了一段时间,我有一个windows窗体和一个web界面。这项服务最初是在XP上开发的,但我最近迁移到了Windows7。当我迁移时,我发现该服务的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仍然没有定义端点、行为或绑定。另外,奇怪的是,在定义的两个数据契约中,有一个只有一个新成员:它的数据成员不存在。这是一个数据协定,它引用了一个标记为可序列化的类,但没有列出DataContract属性。唯一改变的是我在类中添加了一个新的字符串成员。更奇怪的是,xsd文件中对数据协定类有一个正确的定义


我很困惑。

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

好吧,经过一番推敲,我终于找到了答案。问题是由于我在web应用程序中使用的程序集与在服务中使用的程序集相同,我在web应用程序中使用了程序集的不同部分。这导致了一个属于数据契约的类,我为服务的使用而修改了该类,使其在web应用程序的编译中有所不同
d程序集,而不是服务正在发布的程序集。这进而导致服务引用无法生成客户端代理。没有客户端代理,我的web应用程序代码显示错误,因此我从未尝试编译解决方案。简单的答案是只在web应用程序中构建可以正常工作的公共程序集,然后服务引用正确地生成代理。想象一下,如果一个类中只有一个数据成员是问题的明显原因,但它的名称、数据类型、在代码中的位置等对问题没有影响,我会多么困惑!无论如何,重用此程序集的设计可能很糟糕-最好从服务本身使用此信息。最后一点,winform应用程序工作的原因是我在winform应用程序中也使用了相同的程序集,并且在编译应用程序时它始终保持最新,因此更改不会发生冲突。希望这对将来的人有所帮助。作为对Microsoft的补充说明-关于此冲突的任何错误信息都会对解决问题有很大帮助,尽管我承认这可能不是常见的情况。

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

我希望你能成功


有趣的是,作为更改的一部分,我碰巧在顶层添加了一个枚举。我将区分XSD,看看有什么。谢谢-我从来没有想到过这样的问题。你是如何解决你的问题的?我们偶然发现了一些解决办法。不太令人满意的方法是将枚举向下移动一个级别,将其包装到其他结构中。一个更好的解决方法是确保MessageBodyMemberAttribute的Name属性与枚举的类型相同。