此WCF错误意味着什么:“自定义工具警告:无法导入wsdl:portType”

时间:2009-12-09 10:05:45

标签: wpf wcf service-reference

我在我的解决方案中创建了一个WCF服务库项目,并提供了对此的服务引用。我使用类库中的服务,所以除了类库之外,我还有来自WPF应用程序项目的引用。服务直接设置 - 仅更改为获取异步服务功能。

一切正常 - 直到我想更新我的服务引用。它失败了,所以我最终回滚并重试,但即便如此也失败了!因此 - 更新服务引用失败而不对其进行任何更改。为什么?!

我得到的错误就是这个:

Custom tool error: Failed to generate code for the service reference 
'MyServiceReference'.  Please check other error and warning messages for details.   

警告提供了更多信息:

Custom tool warning: Cannot import wsdl:portType
Detail: An exception was thrown while running a WSDL import extension: 
System.ServiceModel.Description.DataContractSerializerMessageContractImporter
Error: List of referenced types contains more than one type with data contract name 'Patient' in  
namespace 'http://schemas.datacontract.org/2004/07/MyApp.Model'. Need to exclude all but one of the 
following types. Only matching types can be valid references: 
"MyApp.Dashboard.MyServiceReference.Patient, Medski.Dashboard, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" (matching)
"MyApp.Model.Patient, MyApp.Model, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" (matching)
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:portType[@name='ISomeService']

也有两个类似的警告说:

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://tempuri.org/']/wsdl:portType[@name='ISomeService']
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:binding[@name='WSHttpBinding_ISomeService']  

同样的:

Custom tool warning: Cannot import wsdl:port .. 

我发现这一切都令人困惑。除了我通过服务参考获得的那个,我在客户端仪表板上没有Patient类。那是什么意思呢?为什么突然显示出来?记住:我甚至没有改变任何东西!

现在,找到了here的解决方案,但没有解释这意味着什么。所以;在服务的“配置服务引用”中,取消选中“在引用的程序集中重用类型”复选框。重建现在一切正常,没有问题。但是我真正改变了什么呢?这会对我的申请产生影响吗?什么时候应该取消选中?我确实想重用我已经设置DataContract的类型,但没有更多。我仍然可以访问那些没有经过检查的人吗?

13 个答案:

答案 0 :(得分:149)

我在这里找到了答案:http://www.lukepuplett.com/2010/07/note-to-self-don-let-wcf-svcutil-reuse.html

长话短说:我从高级菜单中取消选中在参考程序集中重用类型


我不知道这是否重要,但我不使用MVC,而是使用Web Forms。

答案 1 :(得分:35)

添加服务引用时,有两种方法可以处理服务使用的类型:

  • 类型存储在dll中,该dll从客户端和服务器应用程序引用。
  • 类型不在客户端引用的dll中。在这种情况下,创建服务引用的工具将在references.cs文件中创建类型。

有很多事情可能会出错。我们发现,如果该工具崩溃,有时删除服务引用并重新开始会更快。

我们已停止使用服务参考。对于我们控制客户端和服务的项目,我们使用此screencast中描述的方法。

答案 2 :(得分:9)

今天我也有这个问题。我花了整整一天才发现自己的错误。希望它有所帮助。

我无法导入的类具有cutom枚举类型属性。此属性标记为DataMember,Enum也标记为DataContract。到目前为止一切都很好。 我忘了将每个枚举成员标记为EnumMember。

所以我改变了

[DataContract]
public enum SortMethodType
{
    Default = 0,
    Popularity = 1,
    ReleaseDate = 2,
    PublishedDate = 3,
    TranslatedTitle = 4,
    OriginalTitle = 5,
    UserRating = 6,
    Duration = 7
}

对此:

[DataContract]
public enum SortMethodType
{
    [EnumMember]
    Default = 0,
    [EnumMember]
    Popularity = 1,
    [EnumMember]
    ReleaseDate = 2,
    [EnumMember]
    PublishedDate = 3,
    [EnumMember]
    TranslatedTitle = 4,
    [EnumMember]
    OriginalTitle = 5,
    [EnumMember]
    UserRating = 6,
    [EnumMember]
    Duration = 7
}

它终于奏效了!

答案 3 :(得分:8)

在添加引用时转到高级属性并从清单中删除“System.Window.Browser”,它解决了问题。

答案 4 :(得分:8)

这可能听起来很奇怪,但我通过删除引用,然后关闭Visual Studio,再次重新打开它,最后再次添加引用来修复它。

我认为需要重新启动自定义工具或其他东西。

答案 5 :(得分:4)

我在其他开发者计算机上运行时经常遇到此错误。虽然我在我的虚拟机中到处都是完整的管理员,但我尝试关闭Visual Studio,并以“以管理员身份运行”重新打开并且神奇地工作。

祝你好运。

答案 6 :(得分:2)

将解决方案从Visual Studio(VS)2010升级到2013并将每个项目的.NET Framework从4更改为4.5.1后,我收到了警告。我关闭了VS并重新打开,警告消失了。

答案 7 :(得分:1)

关闭“引用程序集中的重用类型”的一个缺点是它可能导致模糊引用的问题。这是因为服务引用在引用.cs文件中再次创建了这些对象,并且实现该服务的代码可能是从原始命名空间引用它们。

当这种情况发生时,我发现检查“指定引用程序集中的重用类型”是有用的,它允许我选择仅具有模糊引用的那些,这样就可以快速解决问题。

希望它可以帮助别人。

答案 8 :(得分:0)

我的WCF服务接口位于程序集中,实现位于另一个程序集中,服务引用位于另一个程序集中,与服务引用的客户端分开。我在将DataContract应用到枚举后立即收到错误消息。将EnumMember应用到枚举字段后,问题就解决了。

答案 9 :(得分:0)

如果您的服务没有任何问题(例如枚举问题或其他人提及的非序列化类),请尝试使用新参考创建新项目

我正在使用Silverlight 5,我曾尝试删除并多次重新创建引用。 reference.cs文件每次都是完全空的,自从我创建它以来已经好几年了,所以试图弄清楚服务中的变化是不可能的。

我注意到该错误包含对2.0.5.0的引用。现在我甚至不知道这是否与Silverlight版本实际相关,但它让我想到了创建一个全新的项目然后突然一切都有效。

  

警告2自定义工具警告:无法导入wsdl:portType详细信息:An   运行WSDL导入扩展时抛出异常:   System.ServiceModel.Description.DataContractSerializerMessageContractImporter   错误:无法加载文件或程序集'System.Xml,Version = 2.0.5.0,   Culture = neutral,PublicKeyToken = 7cec85d7bea7798e'或其中一个   依赖。该系统找不到指定的文件。 XPath到   错误来源:// wsdl:definitions [@targetNamespace =''] / wsdl:port   输入[@ name ='IShoppingCart']

答案 10 :(得分:0)

我正在查看我的项目,我遇到了同样的问题。原来它是WCF与网站上相同DLL的不同版本。 Web站点有一个较新版本的DLL,该服务引用了旧版本的DLL。一旦它们全部同步,一切运作良好。

答案 11 :(得分:0)

我遇到了同样的错误。我挣扎了近一天,试图找出问题所在。我的线索是VS投掷的警告。它试图对Yahoo.Yui.Compressor.dll进行某种映射,这是我几天前添加和删除的库(因为我决定不使用它)。这是令人震惊的,因为图书馆不在那里,但不知怎的,它试图引用它。

最后,我从“废纸篓”恢复此dll,然后我可以成功更新我的服务参考。

答案 12 :(得分:0)

对于将来这里的任何人,我都有同样的错误,但是由版本问题引起的,有两种不同的方式。

我有两个WCF服务和两个通过服务引用进行通信的客户端应用程序。我更新了双方的nuget包,并尝试更新服务引用并得到此错误。

删除没有帮助。不需要取消选中“重用程序集”,因为我需要重用它们 - 这就是重点。

最后,有两个不同的问题:

1)我认为第一个问题是视觉工作室缓存问题。我仔细检查了所有引用,发现没有问题,但仍然报告无法找到该文件的先前版本。我卸载了所有的nuget包,重新启动了visual studio,并重新安装了它们。更新服务参考有效。

2)第二个问题是由依赖性问题引起的。我更新了双方的nuget包,一切看起来都是正确的,但没有标记的依赖是不同步的。例如:

Package Foo v1引用Bar v1。 可以在不更新引用的情况下独立地将Foo和Bar更新为v2。 如果同时安装Foo和Bar v2,则服务引用工具将扫描Foo v2,请参阅Bar v1的引用,并因为无法找到旧版本而失败。 如果您为每个包更新dll的版本号,则只能正确报告。 Visual Studio和MSBuild在构建应用程序时没有任何问题,但是服务引用将很难用来解决所有问题。

我希望这有助于某人。