服务引用错误:无法为服务引用生成代码

时间:2010-10-20 12:06:17

标签: c# .net visual-studio-2010 web-services service-reference

我有一个Windows服务解决方案,我正在尝试在VS2010中为Hermes(Opensource 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

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

非常感谢任何想法。

由于

13 个答案:

答案 0 :(得分:293)

必须从配置服务引用选项

取消选中所有引用程序集中的重用类型

Check this for details

答案 1 :(得分:121)

右键点击您的服务参考,然后选择Configure Service Reference...

Configure Service Reference

然后取消选中Reuse types in referenced assemblies

Reuse Types

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

答案 2 :(得分:16)

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

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

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

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

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

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

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

答案 3 :(得分: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服务中使用的程序集是客户端上使用的不同版本的程序集。

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

答案 4 :(得分:1)

猜测问题是非常困难的,因为它是由于WSDL中的错误和而没有检查WSDL,我不能评论更多。因此,如果您可以共享您的WSDL,请执行此操作。

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

一般来说,我发现微软的Web服务实现非常好,所以我认为Web服务正在回送狡猾的WSDL。

答案 5 :(得分:0)

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

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

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

更新服务引用后,请务必将其重新添加。

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

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

答案 8 :(得分:0)

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

答案 9 :(得分:0)

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

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

答案 10 :(得分:0)

我在尝试更新服务引用时遇到此问题(错误仅在添加服务引用时显示)但不想删除程序集重用复选框。

对我有用的是:

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

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

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

答案 11 :(得分:0)

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

  • 删除要重复使用的引用程序集
  • 删除项目的所有bin文件夹
  • 更新服务参考
    • 保留"在指定的引用程序集中重用类型"
  • 再次添加对程序集的引用以修复错误
  • 再次更新服务参考

答案 12 :(得分:0)

重新启动Visual Studio帮了我大忙。我正在使用VS 2015。

相关问题