服务引用错误: 未能为服务引用生成代码

我有一个 Windows 服务解决方案,并试图添加一个服务引用到一个 Hermes (Opensource ebms 消息服务器)在 VS2010的 Web 服务。

我可以使用它的 URL 找到 Web 服务,但是当我尝试填充 Service 引用时,在 Visual Studio 中会得到以下错误:

Error 8 Custom tool error: Failed to generate code for the service reference 'testService'.  Please check other error and warning messages for details. C:\Users\Admin\documents\visual studio 2010\Projects\MyProject\MyProject.MessageHandler\Service References\testService\Reference.svcmap 1 1 MyProject.MessageHandler




Warning 6 Custom tool warning: Cannot import wsdl:binding
Detail: There was an error importing a wsdl:portType that the wsdl:binding is dependent on.
XPath to wsdl:portType: //wsdl:definitions[@targetNamespace='http://service.ebms.edi.cecid.hku.hk/']/wsdl:portType[@name='EbmsStatusQuery']
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://service.ebms.edi.cecid.hku.hk/']/wsdl:binding[@name='EbmsSoapHttpStatusQuery'] C:\Users\Admin\documents\visual studio 2010\Projects\MyProject\MyProject.MessageHandler\Service References\testService\Reference.svcmap 1 1 MyProject.MessageHandler


Warning 7 Custom tool warning: Cannot import wsdl:port
Detail: There was an error importing a wsdl:binding that the wsdl:port is dependent on.
XPath to wsdl:binding: //wsdl:definitions[@targetNamespace='http://service.ebms.edi.cecid.hku.hk/']/wsdl:binding[@name='EbmsSoapHttpStatusQuery']
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://service.ebms.edi.cecid.hku.hk/']/wsdl:service[@name='EbmsMessageStatusQuery']/wsdl:port[@name='EbmsStatusQuery'] C:\Users\Admin\documents\visual studio 2010\Projects\MyProject\MyProject.MessageHandler\Service References\testService\Reference.svcmap 1 1 MyProject.MessageHandler


Warning 5 Custom tool warning: Cannot import wsdl:portType
Detail: An exception was thrown while running a WSDL import extension: System.ServiceModel.Description.XmlSerializerMessageContractImporter
Error: Schema with target namespace 'http://service.ebms.edi.cecid.hku.hk/' could not be found.
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://service.ebms.edi.cecid.hku.hk/']/wsdl:portType[@name='EbmsStatusQuery'] C:\Users\Admin\documents\visual studio 2010\Projects\MyProject\MyProject.MessageHandler\Service References\testService\Reference.svcmap 1 1 MyProject.MessageHandler

一些调查似乎表明,这是由于 svcutil.exe 无法构建代理,因为没有对目录的权限(可能是 c: windows temp)。我已经尝试分配各种访问权限,但我真的不确定哪个用户需要该权限,或者它只是一个红鲱鱼。

有任何想法都会很感激。

谢谢

127331 次浏览

由于问题是由于 WSDL 和 如果没有检查 WSDL,我不能进行更多的注释。中的错误造成的,因此猜测问题是极其困难的

我所能说的是,在 WSDL 中似乎缺少一个模式(目标名称空间为“ http://service.ebms.edi.cecid.hku.hk/”)。当包含指令被忽略时,我知道问题和对模式的不同处理。

总的来说,我发现微软的 Web 服务实现相当不错,所以我认为 Web 服务正在发回不可靠的 WSDL。

必须从“配置服务引用”选项中取消选中所有引用程序集中的“重用类型”

看看这个

我在 Silverlight 5(VS2012)中得到了相同的错误

还可以删除对以下内容的引用:

  • System.ServiceModel.DomainServices.Client
  • System.ServiceModel.DomainServices.Client.Web

在更新了服务引用之后,请确保将它们重新添加到。

Http://uliasz.com/2011/06/wcf-custom-tool-error-failed-to-generate-code-for-the-service-reference/#comment-1647

感谢上面的文章。

在我的例子中,我在 VS.Net 2008中的 WPF 项目遇到了这个问题。在阅读了本文之后,我意识到 Web 服务中使用的程序集是客户端上使用的程序集的不同版本。

在客户端上更新程序集之后,它就可以正常工作了。

我在尝试从 ASP 生成 Web 服务的客户端时也遇到了类似的错误。使用 Visual Studio 2012的 Net MVC 4.0项目。

问题的根源似乎在于,我试图生成客户端的项目引用了一个程序集,而这个程序集又依赖于另一个没有被引用的程序集。

当在服务配置中启用“引用程序集中的重用类型”时,服务生成器可能正在检查所有引用的程序集,以获得可重用的类型列表。其中一个引用的程序集正在引用另一个不可用的程序集,这可能导致生成器失败。

从服务配置 将解决上述问题中取消选中“在引用的程序集中重用类型”,但是这有一个副作用。存在重用类型选项是有原因的,并且在某些情况下,它避免了在使用服务的代码中进行不必要的强制转换。

例如,如果服务本身是使用 WCF 构建的,并且其中的一些方法参数属于 System 类型。如果禁用重用类型选项,则它们将被转换为生成的客户端中的字符串。

与禁用重用类型相比,我更喜欢 的另一种选择是添加来自专门为此目的创建的 Class Library 项目的服务引用。需要记住的一件事是将所有与服务相关的配置从类库的 app.config 复制到启动项目的配置文件中。

如果在本地程序集中定义的类型需要在服务客户端中重用,那么只需从上述类库项目中引用这些程序集及其所有依赖项。

右键单击您的服务引用并选择 Configure Service Reference...

Configure Service Reference

那就取消 Reuse types in referenced assemblies

Reuse Types

单击 OK,清理并重新生成解决方案。

如上所述,可能存在两个不同的问题。我们发现。添加了 WCF 库的 DLL 作为对客户端项目的引用。这反过来又造成了解析对象的问题,从而导致文件被代码生成步骤“清空”。虽然取消选中“ Reuse Types...”看起来像是一个答案,但它在一个新的名称空间中创建了对象类型的额外定义,这些对象类型是实际类型的代理,这会导致使用这些类型时出现各种各样的“兼容性”问题。只有当你真的想“隐藏”一个类型时,你才应该检查这个选项。

当您不希望“ DLL”类型依赖项“泄漏”到您试图与另一个项目分离的项目中时,隐藏该类型将是适当的。如果 WCF 库项目的 DLL 爬行到客户端项目引用中,那么您将会遇到各种奇怪的副作用的问题,因为类型定义也在 DLL 中。

面临同样的问题,通过在管理模式下运行 VisualStudio 解决

我遇到这个问题时,在 VS2015专业版中升级 VS2010 WCF + S ilverlight 解决方案。除了从 Silverlight 4自动升级到 Silverlight 5之外,服务引用重用复选框的值也发生了变化,并且生成失败。

发生此错误时,“重用类型”并不总是问题所在。

在添加对旧服务的引用时,单击“高级”,然后单击“添加 Web 引用”。现在链接到您的 wsdl,一切都应该工作。

我在尝试更新服务引用时遇到了这个问题(错误只在添加服务引用时显示) ,但是我不想删除组装重用复选框。

对我起作用的是以下几点:

  • 删除要重用的引用程序集
  • 更新服务引用
  • 保持“在指定的引用程序集中重用类型”
  • 忽略这些错误,因为缺少引用!
  • 再次向程序集添加引用以修复错误
  • 再次更新服务引用

瞧,现在它实际上更新了,不再试图删除我生成的所有代码了。

我差点就放弃重用类型特性了。

编辑: 还要确保构建配置是 AnyCPU 或 x86,因为 svcutil 在 x64中存在 bug。

对下面的选民说: 对不起,如果它不适合你,我甚至不知道它为什么适合我,但它确实适合你。那次我可能做了些别的事情来解决这个问题,但是现在没办法知道了。

如果你想纠正这个问题,而又不去勾选装配重用复选框,下面的方法对我很有效:

  • 删除要重用的引用程序集
  • 删除项目的所有 bin 文件夹
  • 更新服务引用
    • 保持“在指定的引用程序集中重用类型”
  • 再次向程序集添加引用以修复错误
  • 再次更新服务引用

重新启动 VisualStudio 为我做了这个技巧。我正在使用 VS2015。