此 WCF 错误是啥意思:“自定义工具警告:无法导入 wsdl:portType”

Posted

技术标签:

【中文标题】此 WCF 错误是啥意思:“自定义工具警告:无法导入 wsdl:portType”【英文标题】:What does this WCF error mean: "Custom tool warning: Cannot import wsdl:portType"此 WCF 错误是什么意思:“自定义工具警告:无法导入 wsdl:portType” 【发布时间】:2010-12-24 18:40:19 【问题描述】:

我在我的解决方案中创建了一个 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 的类型,但没有更多。如果没有这个检查,我仍然可以访问那些吗?

【问题讨论】:

好的,在 msdn (msdn.microsoft.com/en-us/library/bb628653.aspx) 上有一个简短的解释。但是有人有更好的解释吗?这如何引用我设置的 DataContract? 【参考方案1】:

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

长话短说:我从高级菜单中取消选中Reuse types in reference assembly


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

【讨论】:

还需要重启VS 2012 有兴趣看,但链接已失效,如果你在别处有请分享 在VS2013下的MVC 3项目中工作(无需重启)。 +1 - 仅供参考:要进行此更改,请右键单击使用它的项目中的服务引用,然后选择“配置服务引用...” 没有什么比“长话短说”更好的了:)【参考方案2】:

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

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

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

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

【讨论】:

谢谢!我昨天真的找到了那个截屏视频。看完了,真是大开眼界!一旦我掌握了基础知识,我计划搬到那个结构。听起来你一直在努力解决我看到的一些相同的问题。当出现奇怪的问题时,我经常会删除和读取服务引用,这不是一个好兆头。希望所描述的架构会有所帮助! 当您在 Silverlight 5 中使用 PollingDuplex 绑定时,是否有人能够手动编写 Web 服务?【参考方案3】:

我今天也遇到了这个问题。我花了一整天的时间才发现我的错误。希望对您有所帮助。

我无法导入的类有一个自定义枚举类型属性。此属性标记为 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

终于成功了!

【讨论】:

【参考方案4】:

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

【讨论】:

谢谢!不再使用服务引用 - 使用@Shiraz 回答的截屏视频中描述的手动方法。但这还是很高兴知道的!【参考方案5】:

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

我认为需要重新启动自定义工具之类的东西。

【讨论】:

即使您决心在不删除参考的情况下找出问题所在,我强烈建议您创建一个新项目并添加参考以查看它是否有效。这可能会揭示您在现有项目中看不到的错误,或者它可能正常工作【参考方案6】:

当它在另一台开发人员机器上运行时,我经常遇到此错误。尽管我在我的虚拟机中到处都是完整的管理员,但我尝试关闭 Visual Studio,然后使用“以管理员身份运行”重新打开,它神奇地工作了。

祝你好运。

【讨论】:

【参考方案7】:

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

【讨论】:

这对我有帮助,但我从 .NET 4.5.2 更改为 4.6 Gaa!【参考方案8】:

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

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

希望对其他人有所帮助。

【讨论】:

【参考方案9】:

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

【讨论】:

【参考方案10】:

如果您怀疑您的服务没有任何问题(例如枚举问题或其他人提到的不可序列化的类),请尝试使用新引用创建一个新项目 .

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

我注意到该错误包含对 2.0.5.0 的引用。现在我什至不知道这是否真的与 Silverlight 版本相关,但它让我想到只是创建一个全新的项目,然后突然一切正常。

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

【讨论】:

【参考方案11】:

我在查看我的项目时遇到了同样的问题。结果证明是 WCF 与网站上相同 DLL 的不同版本。 网站有较新版本的 DLL,而服务引用的是较旧版本的 DLL。一旦它们全部同步,一切都会运行良好。

【讨论】:

【参考方案12】:

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

最后,我从废纸篓中恢复了这个 dll,然后我就可以成功更新我的服务引用了。

【讨论】:

【参考方案13】:

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

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

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

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

1) 我相信第一个问题是 Visual Studio 缓存问题。我仔细检查了所有参考资料,没有发现任何问题,但仍然报告无法找到该文件的先前版本。我卸载了所有的 nuget 包,重新启动了 Visual Studio,然后重新安装了它们。更新服务参考有效。

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

Package Foo v1 引用 Bar v1。 可以在不更新引用的情况下将 Foo 和 Bar 独立更新到 v2。 如果您同时安装 Foo 和 Bar v2,服务参考工具将扫描 Foo v2,查看对 Bar v1 的参考,但由于找不到旧版本而失败。 仅当您为每个软件包更新 dll 的版本号时,才会正确报告此问题。 Visual Studio 和 MSBuild 在构建应用程序时不会出现问题,但服务引用将很难解决所有问题。

我希望这对某人有所帮助。

【讨论】:

以上是关于此 WCF 错误是啥意思:“自定义工具警告:无法导入 wsdl:portType”的主要内容,如果未能解决你的问题,请参考以下文章

从 WCF 客户端传播到 WCF 服务的事务的隔离是啥意思?

“进程已分叉,您无法安全地使用此 CoreFoundation 功能。您必须执行()。”是啥意思?错误是啥意思?

GLSL 错误:2001 - 此错误代码是啥意思?

在此错误消息中“直接在 useEffect 中移动此变量”是啥意思?

这个错误是啥意思?

这个 NSZombie 错误消息是啥意思?