136

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

我可以使用它的 URL 找到 Web 服务,但是当我尝试填充服务参考时,我在 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)的权限而无法构建代理。我已经尝试分配各种访问权限,但我不确定哪个用户需要该权限,或者它是否只是一个红鲱鱼。

任何想法将不胜感激。

谢谢

4

13 回答 13

311

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

检查此以获取详细信息

于 2011-08-22T08:53:46.927 回答
128

右键单击您的服务参考并选择Configure Service Reference...

配置服务参考

然后取消勾选Reuse types in referenced assemblies

重用类型

单击OK,清理并重建您的解决方案。

于 2013-10-17T14:58:42.677 回答
18

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

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

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

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

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

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

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

于 2013-04-03T12:20:44.350 回答
3

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

感谢上面的文章。

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

更新客户端上的程序集后它工作得很好。

于 2013-03-07T14:09:55.773 回答
2

猜测这个问题是非常困难的,因为它是由于 WSDL 中的一个错误,并且没有检查 WSDL,我无法发表更多评论。因此,如果您可以共享您的 WSDL,请这样做。

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

一般来说,我发现 Microsoft 的 Web 服务实现非常好,所以我认为 Web 服务正在发回不可靠的 WSDL。

于 2010-10-20T12:19:37.373 回答
1

重新启动 Visual Studio 对我有用。我正在使用 VS 2015。

于 2018-07-05T21:22:37.960 回答
0

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

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

于 2014-06-17T16:37:55.527 回答
0

我在 Silverlight 5 (VS2012) 中遇到同样的错误

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

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

更新服务引用后,请务必重新添加它们。

于 2013-02-01T06:07:00.943 回答
0

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

于 2015-06-09T21:41:14.940 回答
0

我在 VS2015 Professional 中升级 VS2010 WCF+Silverlight 解决方案时遇到了这个问题。除了从 Silverlight 4 自动升级到 Silverlight 5 之外,服务引用重用复选框值已更改并且生成失败。

于 2015-07-22T16:02:32.893 回答
0

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

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

于 2016-06-13T11:37:12.987 回答
0

如果您想在不取消选中程序集重用复选框的情况下更正此问题,这对我有用:

  • 删除要重用的引用程序集
  • 删除项目的所有bin文件夹
  • 更新服务参考
    • 保留“在指定的引用程序集中重用类型”
  • 再次添加对程序集的引用以修复错误
  • 再次更新服务参考
于 2018-01-05T08:11:00.023 回答
-1

我在尝试更新我的服务引用时遇到了这个问题(该错误仅在添加服务引用时出现)但不想删除程序集重用复选框。

对我有用的是以下内容:

  • 删除我想重用的引用程序集
  • 更新服务参考
  • 保留“在指定的引用程序集中重用类型”
  • 忽略错误,这是因为缺少参考!
  • 再次添加对程序集的引用以修复错误
  • 再次更新服务参考

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

我几乎准备放弃重用类型功能......

编辑:还要确保构建配置是 AnyCPU 或 x86,因为 svcutil 与 x64 有问题。

致反对者:对不起,如果它对你不起作用,我什至不知道为什么它对我有用,但确实如此。那时我可能已经做了其他事情来解决问题,但现在无法知道。

于 2017-05-18T10:17:30.437 回答